新内容
虚幻引擎5.4进一步优化了UE5核心工具集。此版本优化了多个方面,包括渲染、世界构建、程序化内容生成(PCG)、动画和建模工具、虚拟制片、模拟,等等。
此版本包括我们的虚幻引擎开发人员群体在GitHub上提交的改进。感谢虚幻引擎5.4的每一位贡献者:
AGTomasz、alasher、amuTBKT、aschulz90、AtariDreams、avudnez、batlam987、BenVlodgi、berry0511、BigBirdSDP、BinaerBoy、BioXide、BlueMountainsIO、bovesan、brasky、bstegerESRI、ChetRippo、DannyGoodayle、DanteSSS333、dclyde-brg、DecoyRS、devhyper、disseminate、djbozkosz、djethernet1、DomCurry、dorgonman、DoubleDeez、dpull、DreamSworK、duyaokun、dyanikoglu、EchoRed-3D、erebel55、ericdrobinson、Eyesiah、f3db43f4g443、fahhem、FattyMieo、FlyAndNotDown、foobit、fpwong、gameltb、gaspardpetit、gaurang-ingale、geordiemhall、GregB-WG、Gusten、hcarrikerriot、hellokenlee、hnrqbaggio、hooni7440、igor-kondratiev、ilkeraktug、ill、intvoker、JakubZbikowski、jamespark-unreal、jeremywhite2k、jiaqiaoyou、jkorpian、jorgenpt、juliancao、Jungle178、Kalmalyzer、KaosSpectrum、KarimLUCCIN、karlingen、kdada、kdbn、KeithRare、kissSimple、klukule、KristofMorva、kyoilkim、ldisthebest、LennardF1989、lightbringer、Lithel、lolisia、losjun、LtRandolph、MagForceSeven、MalikuMane、MarcoAltomonteMilestone、MarcusSvensson92、MartinWickhamFB、mastercoms、Maxime、obinot、meglinge、midgen、MihailPreis、Mystfit、najmm01、nchapmantimberline、negril、nickdarnell、originomeg、PhDittmann、phebert74、phisko、PICO-XR、pierricgimmig、projectgheist、Promesis、psketi、RandomInEqualities、Rideron85、RiotJoshuaGlazer、Ronsenval、rqgbx、RVillani、saim80、sapayne、scahp、shchavinskyi、Sigma-Erebus、slonopotamus、splatxman、SRombauts、SungJJinKang、sunluchang、Szmyk、TaaviVarjo、Tanc-ANT、teddemunnik、tehpola、thomasvanta、thraidh、tilongzs、tmcguire-meta、tnam、TroutZhang、Vaei、Victov、vorixo、wouter140、wwKevinS、Xertor、xuelongmu、zenoengine、zgrapher、zhaojunmeng
角色和动画
动画编辑工具的可扩展性
该功能为蓝图/Python API提供了进一步可扩展性,使用户能够创建用于动画编辑的可自定义工具。
- 更好的选择脚本 - 你可以抓取选定关键帧并在Sequencer中编辑选择的对象。
分层控制绑定
全新的分层控制绑定系统可以让你在诸多工作流程上利用控制绑定的所有强大功能,而无需烘焙数据来以破坏性的方式编辑角色。
动画编辑

新的小工具
本次更新引入了为平移、旋转、缩放重新设计的小工具,为姿势处理和动画提供了熟悉而直观的界面。
-
改进的外观和样式。
-
恰当的间接操控。
-
改进的轨迹球。
-
处理姿势时在视口中提供了一个父空间选项。我们之前只提供了世界和本地选项。
约束2.0
我们重写了约束系统的大部分内容,以更好地处理关卡序列工作流程。
-
动画约束现在完全存储在关卡序列中。
-
改进了求值引擎,更好地支持更多约束设置,而不造成循环。
-
关注用户体验,改进了工具的使用体验。
动画细节2.0/通道盒(模型)
我们改造了动画通道盒,为其他热门DCC工具的用户提供更熟悉的体验。
后期重定向阶段
我们添加了一个新的重定向阶段,可在IK重定向器产生重定向结果之后处理一组操作。这些操作按特定堆栈顺序应用,旨在解决很有挑战性或不能完全由FK重定向链映射或全身IK重定向解决的重定向问题。
这样就能提供恰当的分配IK骨骼,以便匹配源动画或重定向结果、重定向动画上的根骨骼运动生成以及动画曲线重新映射。
Sequencer可读性
在过场动画空间中创建更有吸引力的体验,以扩大受众并提升用户体验,可创建更快速、更优质、更复杂的过场动画体验。
-
轨道状态的大纲视图列 - Sequencer层级树的左侧现在新增了数列,供用户查看和访问带图标的轨道固定/静音/锁定/独奏(Pin/Mute/Lock/Solo)状态。
-
关键帧状态指示器 - 在Sequencer中工作时,可制作动画的属性的关键帧图标现在基于属性的当前关键帧状态更改。用户可以轻松辨别属性是已设为关键帧、未设为关键帧、部分设为关键帧还是已修改。
-
Sequencer树外观和颜色改进 - 对Sequencer树的外观和颜色进行了重大更改,以便更轻松地查看Sequencer树中的内容。
Sequencer中动画材质的扩展
我们扩展了Sequencer中的编辑材质动画的功能。它现在支持分层材质参数、覆层材质、体积云组件和自定义图元数据。材质插槽现在从插槽名称引用,而不是从索引引用,并可以在网格体组件更新时在Sequencer中重新绑定。
此扩展完善了现有功能,使用户可以在Sequencer中创建任何基于材质的动画。
绑定生命周期轨道

为了确定何时在Sequencer中绑定对象,所有绑定现在有了一个新的轨道,名为绑定生命周期轨道。用户可以添加额外的分段来确定Sequencer能够控制绑定对象的时间段。
对于游戏中的过场动画,这有助于确定Gameplay或Sequencer是否可以控制动态对象,例如玩家角色。
模块化控制绑定(试验性)
模块化控制绑定 使用控制绑定的整个框架来构建可立即在任何骨架上制作动画的强大动画绑定。
模块绑定工具
-
新的 模块化绑定 资产和编辑器。
-
新的 可视化图解 ,可在视口中提供即时反馈。
-
包含模块的原生 库 。
模块编辑工具:
-
即时将任意控制绑定转换为模块。
-
创建 连接器 和 插槽 以连接模块。
-
新的 连接器事件 将自动在模块之间建立连接。
-
使用Get/Set Metadata节点将元数据添加到模块。
-
前/后前向解算事件允许在模块之间的绑定逻辑。
变形器图表库(测试版)
支持 功能化 变形器图表。变形器可以被封装为函数并链接在一起,以创建新的变形方案。这极大地简化了变形器图表,并允许你混合与匹配 变形器库(Deformer Library) 中预构建的变形器,为你的动画创建自定义变形方案。
-
循环遍历变形器节点。
-
折叠图表并创建函数。
-
变形器函数库(测试版)。
-
线性混合蒙皮、DQ蒙皮、弯曲、扭转、挤压和拉伸、伸展、扭转和格栅。
骨骼编辑器(测试版)

扩展组件编辑 - 更轻松地编辑和选择每个顶点的骨骼和权重。
-
组件编辑器
-
骨骼的组件对齐(顶点、面、边缘)。
-
额外组件选择方案。
-
生成多边形组和绘制多边形组现在有四边形网格体显示
Animation Insights - 在你的动画的上下文中创建骨骼和权重。
-
在绘制时变换骨骼。
-
将骨骼改动传播到引用的动画。
角色化 - 提供优化的起始点和实用的默认值,进一步简化骨骼和权重创建工具。
- 拷贝/粘贴/复制骨骼
控制绑定直接操控

直接操控 支持直接在视口中更轻松地与绑定元素交互。这还包括对控制绑定编辑器交互方式的优化。
在视口中 直观呈现姿势绑定元素 (控制点、骨骼、空),并为实现的节点更新图表中的值。
- 在图表中选择节点,将T、R、S热键用于视口中的即时交互。
易用性 改进,使其更易操控。
-
允许框选。
-
现在可以替换控制绑定AnimBP节点上的控制绑定了。
-
可以将AnimBP函数附加到控制绑定AnimBP节点。
-
现在可以分析函数了。
-
分析统计数据直接显示在图表中。
-
分析现在是帧的滚动平均值,可获得更准确的反馈。
-
现在选择图表节点可对其进行单独分析。
-
元数据节点的速度提高20%。
-
绑定层级使用的内存更少。
两足角色的自动动画重定向

此工作流程将使常见两足骨架的动画重定向在虚幻引擎中更易实现、更统一。
对于常见两足骨架,重定向链创建和全身IK设置现在可以彻底一键自动执行了。在重定向器中,新的姿势对齐工具可以更好地匹配用于重定向的源和目标。
新的简单对话框将自动化过程组合在一起,可以快速批量重定向或生成自动化资产进行额外编辑。
选择器和代理表(测试版)
选择器和代理表提供了一种框架,可以根据游戏情境选择要播放的动画,而无需编写复杂的逻辑。现在这些功能已在虚幻引擎5.4中作为测试版提供。
运动匹配

运动匹配在虚幻引擎5.4中已可用于生成。它随附了一套工具,为Gameplay动画提供了以动画师为中心的工作流程。我们已在《Fortnite》第5章中验证了虚幻引擎的运动匹配。凭借该系统的伸缩性,《Fortnite》第5章得以在所有平台上发布,并在所有100个玩家角色以及NPC上运行。
渲染
神经网络引擎
在编辑器中和游戏中、CPU上以及GPU上,对神经网络应用程序的需求与日俱增。UE中的神经网络推断引擎允许开发人员加载并高效运行其预先训练的神经网络模型。为了解决这些不同的需要,NNE提供了一个类似于现有RHI层的公共API,支持根据每个应用程序的特定需要轻松交换后端。
典型用例包括工具、动画、渲染和物理系统,其中每个单独的用例在平台和模型支持方面都可能有不同的需要。ML后端五花八门,有几十种之多,全部都实现不切实际,因此我们提供了可扩展性钩子,允许外部开发人员在插件中实现NNE接口,提供其自己的运行时。
Nanite - 细分(试验性)

动态可编程置换可用于在运行时使用置换贴图或程序化材质修改Nanite网格体。使用世界位置偏移时,只能在原始网格体顶点上操作,而Nanite置换与之不同,它在运行时会将网格体细分为更多三角形,以符合置换贴图的细节。Nanite只会生成当前像素密度所需数量的三角形细节。
优势包括:
-
可在创作管线中使用更轻的源网格体。
-
依靠材质驱动并制作动画的置换。
-
创建详细的Nanite地形。
有关更多信息,请参阅Nanite虚拟化几何体。
Nanite - 优化的着色
Nanite基于计算的着色是一个长期项目,着重于将Nanite材质从传统栅格着色转移到计算着色器,以获得诸多机会来实现优化和新功能,此外还可以清理栅格方法所需的大量复杂代码。
最终目标是完全替换整个像素着色器路径,在CPU和GPU上提供更高的性能,提高代码可维护性,同时还可以实现原本无法做到的高级Nanite材质功能。
有关更多信息,请参阅Nanite虚拟化几何体。
Nanite - 样条线网格体
样条线网格体用于沿样条线形状对静态网格体变形,例如对地形地貌上的道路建模。样条线网格体亟待实现,因为UE中的场景越来越多地倾向于使用Nanite制作场景内容,尤其是用于提高Lumen和虚拟阴影贴图性能。
对Nanite样条线网格体的支持已在UE 5.3中作为试验性的功能发布。有待完成的工作包括性能和内存优化、防止裂缝,以及修复关卡流送和变换缓存等方面的问题。
有关更多信息,请参阅Nanite虚拟化几何体。
正交摄像机渲染(测试版)
正交渲染是可视化建筑和制造项目的很常见方式,也在游戏中用作风格摄像机选项。在虚幻引擎5.4中,正交渲染已进入测试版状态。现已支持大部分延迟渲染,但可能有一些边缘案例尚未仔细检查。
在实现产品就绪状态之前,有待完成的工作方面包括:
-
环境光遮蔽
-
贴花
-
体积
有关更多信息,请参阅正交摄像机。
时间超级分辨率
时间超级分辨率是UE的内置跨平台分辨率修改技术。由于它将一些开销大的渲染计算分摊到了许多帧,图像渲染的开销只占完整分辨率的一小部分。
下一个版本的虚幻引擎将包含TSR的这些更改:
-
历史恢复 - 关于高、史诗、电影抗锯齿可扩展性的新功能。之前累积的细节可能出于不同的原因被丢弃:遮蔽、着色更改、移至屏幕之外。如果这些细节再次显示在屏幕上,TSR必须重新累积这些细节,这可能带来噪点或尾迹瑕疵。历史恢复会保留旧TSR历史,因为当中有之前看到的细节,每当有比最近帧更好的重新投影匹配项时,将从中重新投影取样。
-
"有像素动画"材质标记 - 新的材质选项,指示材质是有动画纹理还是模式运动,这不会在对象的运动向量中表示。该标记允许TSR禁用防闪烁启发法,如果不禁用,就可能由于缺少运动向量而产生重影。
-
可视化TSR显示标记 :此可视化模式可以用于更好地理解TSR的工作方式,还可以帮助向Epic报告TSR问题。
如需详情,请参阅时间超级分辨率。
异类体积 - 延迟渲染(试验性)

异类体积渲染可创造集成渲染体积现象,例如Niagara流体或Open VDB文件驱动的火焰、烟雾和流体。
在5.4中,我们的着重点是为异类体积以及与现有渲染通道(例如半透明对象)的集成提供阴影投射支持。
延迟渲染器有待完成的许多工作包括添加对全局光照的支持,以及改进功能和性能。
优化着色器烘焙时间
烘焙是将网格体、纹理、材质等资产转换为平台特有的格式来部署打包游戏的过程。在大型项目上烘焙材质可能需要很长时间,常常是好几个小时。
在5.4中,我们大幅改造了执行着色器编译工作的方式,增加了并行化,减少了冗余工作。此优化工作的结果是,编译的着色器减少了大约30%,针对着色器编译任务的游戏线程工作得到减少,着色器预处理速度显著加快。 在这些因素的共同作用下,项目烘焙时间大幅减少,尤其是涉及着色器失效的时间。
RHI - 渲染并行化
渲染线程性能很多时候都是UE游戏的限制因素。这是因为,即使当前平台和图形API可以并行执行操作,有些操作也只能使用这种线程。目标是重构渲染器硬件接口(RHI)API,删除这些约束并完全利用目标硬件的多线程功能,从而提高性能。
我们在5.4中发布了对渲染系统的重大重构,大幅增加了可同时执行的工作,进而减少了目标帧时间。在我们的CitySample测试中,5.4中的渲染线程性能相较于5.0大致快了一倍。
RHI - 无绑定渲染(试验性)
无绑定资源是一种低级别的功能,涉及DX12、Vulkan、Metal等现代渲染器硬件接口(RHI)中纹理和其他类型的数据缓冲区的管理。添加对无绑定资源的支持后,可以在渲染器中实现更灵活的GPU编程范例和额外的功能,而且达到这个要求才能在Vulkan上获得光线追踪的完整支持。
对于5.4版本,此功能在支持SM6的大部分平台上受支持。但是,考虑到我们刚推出该功能,目前仍处于试验阶段,可能有一些漏洞需要解决。
Vulkan - 光线追踪(试验性)
5.4标志着Vulkan光线追踪功能发布了试验性版本,在功能上与DX12对等(包括在Linux平台上)。这意味着,现在可以使用一整套光线追踪功能,包括Lumen和路径追踪中的击中照射模式。作为试验性版本,我们预计会有漏洞和其他错误,因此该版本不适合在生产环境中使用。
程序化PSO预缓存
我们之所以要自动收集和缓存PSO,是为了在给游戏收集所有可能的必需PSO组合时,省去所有手动过程。PSO的最重要状态是着色器本身,其中每种组合都需要恰当预缓存以避免运行时卡顿。为此,着色器预缓存的目标是找到并保存所有可能有效和具有应用潜力的着色器组合。
硬件光线追踪
我们大幅改进了硬件光线追踪(HWRT)。 这些改进对于图元来说速度提高了一倍,并有助于发布使用HWRT的60hz体验。
-
GPU实例剔除、实例和图元的并行化。
-
额外图元类型。
-
优化了路径追踪器,速度相对于版本5.3提高了大约15%,大致相当于版本5.2,而没有减少功能,也无需引入额外的着色器排列。
-
HWRT使用路径追踪器光源网格,因此支持大量光源。
如需更多信息,请参阅硬件光线追踪。
GPU上的大型世界坐标
UE中的大型世界坐标(LWC)引入了对双精度变换和数据类型的支持,允许最大世界大小从21千米增加到88,000,000千米。GPU上的LWC渲染支持基于图块化表示,这存在许多限制,包括不够精确、图块边界附近抖动。
我们正在重构LWC渲染,以支持GPU上的完整双精度表示,这将允许在摄像机远离原点时更可靠地渲染大型世界。工作包括:
*更改扩展GPU浮点表示,以在重要的地方实现更高精度。
-
创建面向用户的工具,以便在LWC中更轻松地处理材质。
-
确保仅在实际需要的地方发出LWC计算,以便节省性能。
更多信息请参阅大型世界坐标渲染
开发者迭代
作为本地DDC的虚幻Zen存储
在UE 5.4中,我们引入了新的虚幻Zen存储服务器架构,它将为"在编辑器中运行"(PIE)工作流程提供改进的数据调节性能以及更快的编辑器加载时间。Zen替代了之前版本中基于"松散文件"的DDC,避免了本地文件系统性能瓶颈,并为用户提供了对缓存写入、逐出和数据去重的更大控制权。
虚幻云DDC
这是一种虚幻派生数据缓存和内容可寻址存储解决方案,它部署在自托管云基础架构上,适合分布式/混合工作室和团队使用。它通过主动/被动区域复制在团队成员之间高效共享烘焙的数据,能自动连接到最近的区域,并提供企业登录和身份验证。
在AWS上受支持并进行了生产测试,包括源和Docker图像。
提供了关于在Azure上部署的说明;包括源和Docker图像。
多进程烘焙
多进程烘焙在UE 5.4中已可用于生产。多进程烘焙会利用所有可用的CPU核心和内存资源,这有助于减少从构建场服务器或你的本地工作站上获取烘焙输出所需的总时间。
根据项目规模和数据的分离情况,性能增益可能有所不同。为获得最佳效果,我们推荐你根据项目和可用硬件规格测试不同的"CookProcessCount"值。
虚幻Horde - 持续集成(测试版)
这是一款为虚幻引擎开发团队设计的,开箱即用的持续集成解决方案。Horde是可水平扩展的分布式持续集成和构建平台系统,挂接到Perforce中,并与虚幻引擎开发者迭代工具和工作流程紧密集成。
虚幻构建加速器(测试版)
虚幻构建加速器(UBA)是用于C++编译的本地和分布式编译解决方案,与虚幻构建工具和/或Horde的远程构建(计算任务)系统一起使用。Horde是分配帮助程序资源的协调器。UBA可传输本地数据、执行远程任务并返回结果。
在虚幻引擎5.4版本中,UBA还处于测试版状态,并适用于Windows操作系统上的C++编译作业。我们推荐使用同一个物理或私有网络上的基础架构试用UBA。UBA可能适用于可达的虚拟或外部网络或云计算实例,但我们不推荐在此版本中使用此方式。
原生macOS和Linux支持、进程闲置检测和着色器编译被视为试验性功能,将在后续版本中正式推出
作为共享DDC的虚幻Zen存储(试验性)
新的虚幻Zen存储服务器架构替代了将网络文件作为DDC存储共享的方法。
此架构对延迟更宽容,并优化了DDC操作与远程计算机的网络通信,而不是之前系统中的文件系统操作;操作不再在DDC存储级别执行同步IO。
动态图形
动态图形模式
引入了虚幻引擎动态图形模式,这是一种具有颠覆性的环境,经过精心打造,可为动态图形设计师配备精准量身定制的工具。我们精心设计的布局确保了工作流程的顺利启动和持续的生产力。动态图形模式配备了2D画布的专门工具,还有层级直观的增强世界大纲视图,提供了全面的套件,包括3D形状、克隆器、效果器、修改器、动画制作器以及非线性动画的功能。该专用模式经过精心设计,可提升动态图形设计体验,提供了用户友好的强大平台,使设计师能够将其创意愿景变为现实。
视口:标尺和导线

在屏幕设计领域,精度决定一切。你需要确保内容恰好放置在所需的地方,这是必须遵守的规则。正因如此,引入动态设计视口让我们万分激动,它可为动态设计师带来前所未有的变革。
动态设计视口功能
2D网格和标尺 :使用2D网格和标尺自信地导航你的画布。这些视觉辅助可提供清晰的参照,以便精确放置内容。
对齐 :使用对齐功能实现无缝对齐。元素会轻松锁定到位,消除对不齐的麻烦。
平移和缩放 :使用平移和缩放功能增强你的视图并专注于特定细节。放大你的设计,进行精细调整。
摄像机视图之外的画布边界 :将你的画布扩展到摄像机视图之外。此功能允许你可视化你的整个设计,确保没有忽略的元素。
2D形状的拖放工作流程 :使用用户友好的2D形状拖放工作流程简化你的设计过程。直观地构建你的构图。
用于快速访问的变换面板 :使用变换面板高效管理和调整元素。轻松快速访问基本功能按钮,无缝进行修改。
视口背景图像或纯色 :使用视口中的背景图像或纯色自定义你的设计环境。按照你的偏好量身定制工作空间。
RGBA - 预览模式 :使用RGBA模式精准预览你的设计。确保表示准确并相应微调你的内容。
克隆器和效果器
设计师可以使用直观的克隆器和效果器系统,轻松让形状和图案变得鲜活,释放出活跃的创造力。从本质上说,克隆器基于虚幻引擎强大的Niagara粒子系统而构建。这一强大的组合为动画制作设计提供了无缝的平台,支持设计师轻松试验无限的变体。
克隆器

克隆器选项
-
网格(Grid)
-
球体均匀(Sphere Uniform)
-
球体随机(Sphere Random)
-
圆圈、线条(Circle, Line)
-
网格体(Mesh)
-
样条线(Spline)
-
蜂巢(Honeycomb)
功能
-
步骤 - 变换每个克隆的安放和缩放
-
随机 - 添加最小值和最大值及变体
-
遮罩 - 基于纹理的约束模式
-
进度 - 对克隆之间的进度制作动画
效果器

效果器功能
-
以程序化的方式对半径和衰减系统中的克隆制作动画。
-
对安放、缩放、旋转制作动画
-
圆圈、盒体、平面、未绑定形状
-
自定义衰减和过渡
- 缓入、缓出、弹入、弹出,等等。
-
量级
-
力
-
方向
-
顶点
-
旋度噪点
-
重力
-
效果器力

在设计中,程序化动画至关重要,我们最新的更新将其提升了一个层次。在我们的效果器系统中,我们为顶点、方向、噪点和重力引入了力,为设计师提供了工具来轻松试验无限的变体。现在可以轻松同时操控许多克隆,从而快速实现酷炫的效果,重新定义创意的潜力。
力(Forces)
-
方向
-
顶点
-
旋度噪点
-
重力
材质设计器
材质设计器引入了直观、用户友好的层堆栈,提供了动态构建复杂材质的无缝体验。它旨在提高效率,让用户能够访问熟悉的混合模式、不透明度功能按钮和遮罩功能。该工具支持用户迅速轻松制作复杂的材质,让这个过程变得易用、高效。
材质设计器功能
-
可停靠的UI面板
-
用于堆叠纹理的层系统
-
设计师友好的混合模式
-
从常见UI偏移、缩放、旋转纹理
-
限制、镜像
-
切换选项而无需重新编译
-
创建和导出动态材质
-
可设为关键帧的属性
材质设计器FX层
我们推出材质设计器的目标是整合层效果,为模糊、色彩校正和失真效果等功能带来可能性。这一方案旨在建立用途广泛的框架,支持用户在虚幻引擎中构建无数着色器效果,增强我们平台的创意功能。
滤镜和特效
-
模糊/扩张/侵蚀
-
颜色:色调/饱和度/亮度
-
关卡
-
失真
-
像素化
-
锐化
Actor对齐工具
设计师经常会调整图形以适应基于网格的系统,这说明可靠的对齐工具十分重要。这些工具支持设计师实现精确、一致的布局。
Actor对齐工具
-
对齐(Align) :左、居中、右
-
分布 :左、居中、右
-
堆叠(Stack) :对齐正面、中间、背面
-
旋转(Rotation) :将旋转对齐到摄像机
-
大小(Size) :按照屏幕设置内容的大小
2D和3D图元

为了在设计师的核心创意过程中提供支持,就要提供相应工具,将程序化形状无缝整合到设计中。这就需要有一套用途广泛的工具,能够生成大量独特的形状。如果设计师拥有灵活的工具,能够直接在视口中实时调整,通过实时和交互式设计修改来增强工作流程,自然是如虎添翼。
3D形状 :
-
球体(Sphere) - 开始纬度、结束经度、开始纬度、纬度度数、侧面的选项
-
圆柱体(Cylinder ) - 侧面、顶部半径、角度度数、开始度数
-
立方体(Cube) - 斜边、斜边数量
-
椎体(Cone) - 侧面、顶部半径、角度度数、开始度数
-
环面(Torus) - 切片、侧面、内大小、角度度数、开始度数
-
齿轮(Cog / Gear) - 切片、侧面、内大小、角度度数、开始度数
每个形状都可以有斜边和端盖,并能够将材质应用于斜边边缘
2D:形状 :
-
矩形(Rectangle) - 左倾斜、右倾斜、全局斜边大小、全局斜边平滑度、TL、TR、BL、BR
-
多边形(Polygon) - 点、内大小数量、斜边、斜边平滑度
-
线条、圆圈、星型、箭头(Line, Circle, Star, Arrow) 和 V形(Chevron)
几何体修改器

设计师希望能够在其设计中程序化修改几何体。该系统有助于将程序化修改器添加到基础几何体,以便进行布尔值等运算。用户可以轻松启用或禁用这些修改器并重新排列其顺序,以便创建多样化的自定义设计。几何体修改器在虚幻引擎几何体脚本编写函数的基础上构建,这意味着该系统未来可以进一步扩展。
几何体修改器
挤压 - 在深度上挤压一块几何体。设计师可以在正面端盖、背面端盖、整块和侧面缩放UV。
斜边 - 将斜边添加到任何一块动态几何体。
布尔 - 基于通道删减、添加与合并。
轮廓/笔划 - 按照设计师的需要,将轮廓或笔划添加到任何2D形状,宽度可变,从0px到20px或更高。
镜像 - 使用修改器轻松翻转或镜像一块几何体。设计师可以沿任意轴(X、Y或Z)镜像几何体,同时还要支持枢轴点。
图案 - 按网格、圆圈等图案复制几何体。
法线 - 重新计算法线。
变形:
混合 - 设计师可以弯曲一块几何体或将其变形。
逐渐变细 - 设计师可以沿对象长度将几何体逐渐变细。
SVG导入器
鉴于以SVG格式生成图形设计和品牌化信息的程序得到广泛使用,设计师需要导入SVG文件。我们的SVG导入器设计为可从任何SVG文件无缝生成3D几何体,同时让材质颜色保持不变。
-
SVG Actor
-
动态交换SVG
-
复制和粘贴SVG - 用于生成几何体的XML
-
挤压
-
斜边
-
端盖
-
UV
文本3D改进
强大的字体功能是设计师的基础必需品,因为它们能为其设计带来鲜明的个性与表现力。我们力求简化字体的搜索和测试过程,提高总体设计效率。
功能
-
预览字体而不导入
-
收藏的字体
-
字体类别
-
将字体导入项目中
-
最大宽度
-
最大高度
-
按比例缩放
-
动态材质
-
动态梯度
-
自定义材质
大纲视图增强功能
支持设计师创建高度具体的层级,用于分组对于动态图形工作流程至关重要的项目。目前该功能是世界大纲视图的单独选项卡。该新功能让设计师能够根据自己的确切需要更好地整理、显示和管理场景。此版本中涉及世界大纲视图的反馈将帮助我们优化虚幻引擎UX。
大纲视图功能
-
非字母顺序排序的Actor。
-
将Actor轻松分组到空对象下。
-
按Actor的可视性状态。
-
用于整理的层着色。
-
用于几何体、动画和远程控制的修改器系统。
-
用于轻松仅显示所需Actor或修改器的筛选系统。
-
用于不自动展开Actor层级的选项。
-
复制和粘贴用于几何体、动画和远程控制的修改器。
-
使用热键移动枢轴点和分组Actor。
-
批量重命名Actor。
重命名工具
确保工作流程精简对于设计师和其他用户至关重要,包括在世界大纲视图中维护恰当的命名规范。为了应对制片中出现大量重复元素的情况,我们引入了一个工具来帮助批量重命名Actor和资产。此工具配备了前缀、后缀、搜索和替换功能,为设计师提供了高效的解决方案来保持工作空间整洁有序。
大纲视图
-
Actor重命名选定项
-
Actor重命名选定类
内容浏览器
-
资产重命名选定资产
-
资产重命名资产类
功能
-
基础重命名
-
前缀 - 添加、删除、列举
-
后缀 - 添加、删除、列举
-
搜索和替换
动画修改器系统

动态图形美术师现在可访问强大的功能,以便轻松将流程性动画添加到几乎任何属性。这一创新型工具带来了无穷无尽的创意可能性,支持美术师无缝整合动态效果,例如扭动、反弹、振荡和随机动画。该工具不仅提高了效率,还创造了一种新的创意表达方式,支持美术师通过迷人的动态背景提升其动态图形。
动画修改器
动画的目标属性
添加程序化波函数以驱动属性
动画函数
正弦、余弦、平方、平方倒数、锯齿波、三角形、反弹、脉冲、花边
过渡逻辑
在直播电视中,无缝呈现多个屏幕上的元素及其平滑过渡至关重要。在直播节目期间,过渡逻辑在精确控制元素的进出方面起着关键性的作用。此功能支持设计师智能地构造图形系统,确保每个元素按预期精准地在屏幕上出现和消失,以便让有影响力的直播活动获得至关重要的精准度。
过渡逻辑功能 :
-
用于决定过渡的状态机
-
将多个元素添加到层
-
设计过渡状态
演播纲要
对于演播设计师,在直播过程中实时执行图形的功能至关重要。操作员使用"演播纲要"这一工具来促进关卡的实时输出。该纲要不仅支持图形测试,还有助于通过SDI或IP视频流实时播放。我们的远程控制系统支持操作员创建多页和多版内容,为无缝直播提供全面的解决方案。
功能
-
按页 - 预览和节目
-
按页更改文本、图形、视频和属性
-
按数字保存页面以方便回忆
-
拖放重新排序
-
预览Alpha通道
-
强大的播放列表API
-
筛选的视图
-
宏
-
多个通道输出
-
使用MRQ渲染到磁盘
交错动画

为了提高设计师的效率,我们引入了一个功能来简化动画的时间偏移。此工具便于用户选择多个层条并轻松应用时间偏移,便于迅速创建动态弹窗动画。
遮罩修改器
遮罩是设计师的基础功能,尤其是在场景始终会整合遮罩元素的动态图形领域。我们致力于无缝地简化工作并提高性能,基于材质提供各种形式的遮罩,优先考虑速度和效率,实现最优设计体验。
不透明度 :使用不透明度功能按钮轻松淡出屏幕上的元素。它无缝集成到材质设计器中,可轻松通过原生支持实现平滑过渡。
纹理 :直接将纹理应用为源,用于遮罩3D模型的特定部分。
几何体遮罩 :使用一块源几何体为定义明确的边缘创建遮罩,为你的遮罩需要提供简单而又有效的解决方案。使用这个用户友好的工具探索优化设计的可能性。
网格排列修改器
此功能为用户配备了网格排列修改器,有助于Actor在层级内均匀分布。该工具对于使用网格系统的基于文本的布局尤其至关重要,允许动态调整布局,适应不同大小的要求。
网格排列功能 :
-
水平对齐:(默认居中)
-
垂直对齐:(默认居中)
-
最大水平项数:0表示没有最大数量,4表示第5项换一行显示
-
填充:各项之间的间距
-
大小(XY):项大小
虚拟制片
多进程内视锥
过去,ICVFX摄像机的内视锥渲染总是无法利用mGPU,因为虚幻引擎/nDisplay的渲染中存在限制,而且至少一些资源必须与其他外视口共享。引入SMPTE 2110支持后,我们现在可以将整个nDisplay渲染节点用于内视锥,使得可用硬件比摄像机中所见的硬件更多(即两个GPUS而不是一个)。多进程内视锥(Multi-Process Inner Frustum) 支持以最高质量渲染内视锥。
随着新摄像机的分辨率升高和体积增大,这将允许系统扩展以满足这些制片需要。
景深估算
景深是电影术语中不可或缺的一部分,是电影摄影技师引导观看者注意力的关键工具。不过,在LED体积中拍摄摄像机内视觉特效处理场景时,无法实现真正准确的景深,因为nDisplay渲染的一切都会获得相同的景深,尽管严格来说,场景中的一些对象比其他对象离摄像机更远。
景深估算解决这个问题的依据是,在虚幻引擎中,我们知道计算"恰当"景深所需的一切,即:
-
虚幻引擎场景中舞台体积的位置和方向。
-
摄像机位置、光圈、镜头焦距和对焦距离(使用LiveLink)。
-
虚幻引擎场景中所有对象之间的距离。
这样就可获得一个新功能,基于考虑到以上信息的计算,使虚幻引擎场景中的对象散焦,以及镜头基于其现实世界光圈/镜头组合已经在应用的散焦。
虚拟堪景工具集(试验性功能)

新的虚拟堪景工具支持线性内容创建者在VR中查看、注释和编辑场景。
我们完全修改了虚拟探查的UX,利用了新的XR创意框架。工具更易于使用,现在开发人员可以更轻松地扩展它们。
你可以使用它来执行以下操作:
-
在多用户编辑器会话中,在VR中查看和编辑关卡。
-
测量
-
注释
-
捕获截屏并放置摄像机。
-
播放关卡序列。
-
创建局部光源。
-
控制环境光源。
此工具集还支持在PIE会话中运行并打包到运行时可执行文件中。
XR创意框架
XR创意框架(XR Creative Framework) 为团队提供了一个开发框架,用于创建编辑器中XR(VR和头戴设备内MR)工具,便于使用最新OpenXR支持的HMD和手柄创建定制工作流程。
该新框架构成了一组更新后的虚拟制片堪景工具的基础。这些工具将作为示例介绍如何在 XR创意框架(XR Creative Framework) 中进行开发。
Android版Live Link VCam
Live Link VCam是编辑器中虚拟摄像机系统的伙伴应用,现在推出了Android版。虚拟摄像机用户使用兼容Android设备的ARCore时,现在可以在其项目上使用完整虚拟摄像机。
Mac版虚拟摄像机
虚拟摄像机推出了带有完整支持的Mac版。用户现在可以利用x86/ARM上的软件像素流送和基于ARM的M系列Mac设备上的硬件加速。
LiveLink Hub
在有多个UE实例在一个多用户编辑会话中运行的舞台或设置上——ICVFX、实时合成、完整CG mocap拍摄和演播室——需要为每个编辑器会话设置LiveLink源。有时设置需要每个编辑器会话采用稍有不同的配置,以使之前的LiveLink默认的加载时预设工作流程不产生效果。
要支持更复杂的工作流程,我们创建了外部应用(类似于多用户Slate服务器)来监控运行中的编辑器会话,连接到LiveLink源,将其可视化并转播到每个编辑器会话。编辑器会话不再需要订阅LiveLink源,该应用会向每个UE实例告知接收哪些LiveLink源以及如何解译(预处理器、轴交换、角色修改)。
初始支持针对LiveLink工作流程,将DMX、OSC和设备控制列入开发路线图。
nDisplay电影摄像机视锥适应
动态调整nDisplay视锥大小,使其适应活动摄像机FOV动画。nDisplay电影摄像机视锥适应 支持所有行业的nDisplay用户使用电影摄像机恰当地将典型UE内容映射到任何形状和配置的物理显示上。
-
计算一组定义的显示器周围的边界框。
-
提供一种机制,使nDisplay视锥适应并缩放到活动或选定UE电影摄像机视锥中。
-
公开"填充与适应(Fill and Fit)"等选项,以恰当地处理长宽比不匹配的问题。
模拟和视觉特效处理
Niagara资产浏览器
新的Niagara资产浏览器可以让用户以用户友好的方式在Niagara发射器和Niagara系统的基础上创造新特效。它提供按标签浏览内容的功能,以便轻松探索各种效果。
它提供了比以往更简化的工作流程:
-
工作流程采用单页UI,而不是多步骤过程。
-
用户可以同时查看所有特效,而这在之前是做不到的。
-
Niagara资产浏览器可以和内容浏览器匹敌,用起来更直观。
用户可以为其资产定义自己的标签,轻松设置内容组。商城创建者等外部内容提供商可以使用自己的标签和标签定义来发布资产,更轻松地整理内容。
Niagara数据通道(试验性功能)
Niagara数据通道(NDC)可在5.4中试用,但我们不建议将其用于发布内容。
NDC是在Niagara系统之间、在Niagara和UE其他部分之间传递数据的一种方法。一个很重要的用例是,使用NDC将事件注入大型共享Niagara系统,为冲击特效等功能实现更好的性能。这可能是用户想试验的一个重要方面。
5.4中的更新包括:
-
GetNDCSpawnData :NDC读取器数据接口上的一个新函数。它允许粒子在读取NDC数据时检索其生成NDC索引和关联数据,以用于粒子脚本中的读函数。
- 相比于覆盖粒子的SpawnGroup,这是更好的替代方法。使用该方法,NDC生成可以在内部合并为单个生成事件,这样做速度快很多,并允许在GPU上实现任意数量的NDC生成,而之前仅限于每帧8个。
-
Emitter.ID :NDC读取器ID函数现在从调用程序接受一个Emitter.ID,以选择要生成到哪个发射器中。这替换了DI上设置的直接绑定,这意味着单个系统级别NDC读取器DI可以生成到Niagara系统中的许多发射器,而不是每个发射器都需要自己的内容。
-
改进了蓝图用户体验 :蓝图现在有单个节点路径,用于将条目写入NDC,以自动填充相关NDC的引脚。
*多项 用户体验和易用性改进 。
- 改进了 稳定性和性能 。
如需了解详情,请阅读Niagara数据通道文档。
Niagara轻量级发射器(试验性功能)
轻量级发射器可在5.4中试用。它们仍处于开发阶段,我们推荐目前暂不用来发布内容。
我们的目标是,在使用轻量级发射器时,提高内容创建速度并减少优化的需要。用户可以在启用项目设置之后,在其系统中创建轻量级发射器,混合并匹配不同的类型。轻量级发射器不需要编译,这样工作流程更快,即使系统中的发射器数量较多,对性能的影响也会更小。
底层技术有很大不同,因为没有粒子状态,数据仅在可见时生成,但其外观应该是Niagara用户所熟悉的。其功能集更加有限。有限数量的模块已转换为轻量级,只有一些渲染器兼容。它们不可从内容编程,即你不能创建暂存器/模块/动态输入。用户可以使用C++扩展功能集,引入新的模块和模板。但是,由于这是试验性功能,后续版本可能会引入重大API更改。
如需了解详情,请参阅Niagara轻量级发射器文档。
Niagara - CPU VectorVM(试验性功能)
VectorVM是Niagara用于在CPU上执行脚本的虚拟机。我们重写了VectorVM解译器,处理CPU脚本的性能更高。原始字节代码现在经历了一轮优化,包括:
-
通过大幅减少必需临时寄存器数量,减少了高点内存使用量。
-
删除了死代码。
-
将许多常见操作对合并为单个操作。
-
重新设置字节代码的格式,减少内存使用量。
启用后,VectorVM的优化对用户来说应该是无缝的。编译CPU脚本时,生成的字节代码将得到优化,并将使用新的解译器(如果可用)。
利用对VectorVM CPU脚本的这些改进,用户会发现处理速度大幅提高。CPU工作负载已大幅减轻(一些脚本的周期数量改进程度达到4倍),但实际益处则没有那么显著,因为内存吞吐量严重限制了执行。现实世界效果是节省了10%的执行时间。
Chaos面板/图案布料编辑器(测试版)
虚幻引擎5.4的 Chaos布料(Chaos Cloth) 包括持续开发的布料编辑器,如将状态从试验版更新为测试版。
从5.3至5.4的变化
-
添加了支持织物的USD导入节点。
-
添加了默认数据流模板。
-
添加了新的数据流节点,并更新了几何体重新网格化节点。
-
更新了选择节点和工作流程。
-
添加了新的碰撞系统,并更新了自碰撞。
-
更新了皮肤权重转移。
-
增加了LOD支持
-
公开了代理(封装)变形器作为数据流节点
-
显示可视化和调试更新。
-
编辑流程优化。
Chaos视觉调试器(测试版)
Chaos视觉调试器(Chaos Visual Debugger) 是新的工具和框架,可在给定游戏或应用程序中录制和播放物理模拟的状态,以用于调试目的。
在UE 5.4中,Chaos视觉调试器分为两大部分:
-
调试数据生成 :用于录制物理模拟状态的系统。
-
调试数据可视化 有自己的编辑器世界、视口、大纲视图、细节面板和录制播放功能按钮的编辑器工具。在工具中加载trace文件后,该工具可以逐帧(以及逐子步骤)播放和可视化模拟状态,以及选择对象来查看在任何给定帧(或子步骤)的状态。
在未来版本中,工具将能够从任何给定录制的帧重新模拟。
如需了解详情,请阅读Chaos视觉调试器文档。
基于物理的角色移动(试验性功能)

基于物理的角色 移动是我们在Character Mover 2.0中构建的新的试验性功能,可在角色与其环境之间进行基于物理的双向交互。
-
系统使用Character Mover 2.0中创建的移动模式,将输出移动作为角色的物理表示的目标运动。
-
角色对与之交互的物理世界部分施加力,而物理力和约束可以反过来影响角色的移动。
-
基于物理的多玩家运动(带有回滚和重新模拟)使用网络物理受支持。
Niagara流体(测试版)
在5.4中,我们向 Niagara流体(Niagara Fluids) 引入了以下改进:
-
2D液体(2D Liquids) :改进了表面和渲染。
-
2D气体(2D Gas) :基于FFT的压力解算器和三次插值。
-
3D气体/液体(3D Gas/Liquids) :使用有限体积方法的高精度边界条件。
-
3D液体(3D Liquids) :使用GPU粒子的双向耦合模拟。
-
2D气体(2D Gas) :缓存支持。
Chaos破坏系统
Chaos破坏系统(Chaos Destruction) 已在虚幻引擎5.4中用于生产。此版本增加了以下改进:
-
几何体集合性能和内存
-
我们显著降低了每个几何体集合实例的内存开销。
-
我们增加了许多性能优化。
-
-
Chaos缓存管理器
- 录制的轨道现在使用简单的压缩方案,这意味着磁盘上和内存中的缓存集合资产更小。
-
几何体集合渲染
- 现在支持带有和不带自定义渲染器的根代理网格体。
ML布料(测试版)
ML布料(ML Clothing) 目前在5.4中为测试版。
-
改进了用于在骨骼网格体上定义多个分段的用户界面。
-
添加了新的训练模式来学习变形目标。
-
改进了工具以自动创建最近相邻数据集。
如需了解详情,请阅读机器学习模拟文档。
网络物理(测试版)
网络物理是5.4中的测试版,提供了两个关键功能:
-
预测性插值(测试版) 是新的物理复制模型,用于仍在"插值"时间轴中运行时处理物理系统的一些本地预测,在特定限制内提供响应迅速、准确的物理复制结果。
-
物理重新模拟(试验性) 是在物理复制需要的响应能力和预测准确度超出预测性插值解决方案所能处理的范围时的解决方案。此解决方案还意味着Pawn在多人游戏中可以基于物理原则。新的NetworkPhysicsComponent可实现自定义物理Pawn来处理自定义输入、状态,以及负责处理物理复制,将输入关联到物理更新函数,在物理重新模拟期间应用输入和状态,根据需要衰减和预测输入,等等。
如需了解详情,请阅读网络物理文档。
世界构建
带3D网格的世界分区运行时哈希
新的 世界分区运行时哈希 解决方案包含分区对象的列表,这些对象可以是不同类型,并可轻松扩展以满足不同项目的要求。每个分区对象保存其HLOD层设置。运行时哈希仍支持数据层,一个Actor一个文件,并依赖流送源组件。新的世界分区关卡将默认为运行时哈希。在关卡中选择新的运行时哈希时,可以选择从之前的空间哈希升级。
运行时哈希使用 松散分层网格 分区类型,这是一个完全3D化的流送网格,其中Actor范围用于改变流送单元边界,减少流送网格关卡提升。
编辑器内HLOD
作为一项工作流程改进,生成的HLOD之前仅在编辑器中运行(PIE)期间可见,而现在可直接在编辑器中查看,并单独进行更新。
你可以在主视口 显示(Show) 选项中调整HLOD的编辑器中最小和最大绘制距离。
关卡实例软对象引用
世界分区现在支持从父关卡中的Actor和对象到关卡实例内的Actor和对象的软对象路径引用。
使用世界分区,关卡实例中的Actor可以嵌入流送关卡单元中,进而导致其运行时对象路径发生更改。对这些Actor的新编辑器软对象路径引用现在将在运行时解析并正常运行。
服务器流送
世界分区现支持专用服务器流送,包括基于流送源位置复制的流入和流出。在多玩家游戏的大型世界中,这可提供更好的服务器平衡和优化。
子世界分区(试验性功能)
你现在可以通过代码或蓝图在关卡中启用多个子世界分区。
若将关卡行为属性设置为独立,并引用启用了流送的世界分区关卡,关卡实例Actor将自动被视为子世界分区关卡。
子世界分区的HLOD在父世界中不支持,将仅在独立关卡实例Actor流送进来时才显示。
运行时数据层逻辑运算符
之前,用于定义运行时状态的默认运行时数据层"OR"逻辑运算符是硬编码的。
项目设置(Project Settings) 中的 新地图数据层逻辑运算符(New Maps Data Layers Logic Operator) 选项意味着,用户可以选择"OR"或"AND"运算符作为新创建的地图中其项目的运行时数据层的默认运行时状态逻辑运算符。
这还可以在 世界设置(World Settings) 下使用 数据层逻辑运算符(Data Layers Logic Operator) 选项按关卡进行设置。
地形Nanite自动异步构建
在启用Nanite的情况下编辑地形时,编辑的图块的Nanite表示需要重新构建。对于UE5.4,此构建操作在后台自动异步处理,同时使编辑器保持响应,并动态提供最新的地形Nanite数据。
对于GPU内存密集型的大型Nanite地形,我们推荐使用以下控制台变量调整可以并行触发的地形Nanite构建的数量:
landscape.Nanite.MaxSimultaneousMultithreadBuilds VALUE
水体可扩展性

我们提高了超大环境的水体可扩展性,这些环境带有动态曲目细分的水体网格体,并在运行时在查看位置附近定义的区域内局部处理水体信息纹理。此区域之外的水体回退到匹配水体形状的静态网格体。
水区Actor上的 仅限局部曲面细分(Local Only Tessellation) 选项可激活运行时水体信息纹理处理,同时可以使用 局部曲面细分范围(Local Tessellation Extent) 调整滑动窗口。
程序化内容生成(PCG)
运行时分层生成

运行时分层生成可在运行时最大化PCG图表执行,因为它可以组合用户定义的网格大小和每个网格的生成距离,添加PCG生成源组件,并根据排序、优先级和更新频率调整生成策略。
作为自动分区运行时执行解决方案,它可以创建更丰富的动态环境、需要实时生成的复杂规则、更大型的程序化世界。
此外,它还可以仅在摄像机或带有PCG生成源的其他Actor周围生成,极大地改进仅限编辑器的工作流程和迭代。
节点图表用户体验
UE5.4引入了多项针对PCG节点图表的用户体验改进,其中包括:
-
命名重路由 :声明命名重路由并将其用于相同图表中的任何地方。
-
调试对象树 :现在,选择调试对象在调试对象树窗口中进行,这让用户更清楚地查看循环迭代、子图表,并改进了相关图表之间的总体切换方式。它还会显示每个调试对象是否有警告和错误。要检查图表中的节点,必须选择一个调试对象。
-
更智能的图表刷新 :为加快迭代速度,在添加未连接的节点或删除未使用的节点时,图表不会刷新,因为其编译的输出完全相同。
-
多数据和空边缘显示 :在PCG中的不同节点之间流动的边缘可以保存多个数据或为空。现在边缘会在流动多数据时加粗显示,并在为空时淡化。常规边缘厚度表示单数据。这只能在选择调试对象来执行之后观察到。
-
多属性列表和细节视图 :你现在可以打开和锁定最多4个属性列表和细节视图。非常适合用于比较节点和数据。
-
输入和输出引脚设置 :可以为引脚设置行为(正常、循环、反馈),并可以删除或编辑IN/OUT。
-
地形追踪模式 :地形编辑回调会使用Get Landscape Data触发图表的PCG更新,并可能导致工作流程问题。在项目设置中,你现在可以设置地形追踪时间延迟,仅在地形编辑模式中禁用,完全禁用地形追踪,或完全禁用全局刷新。
-
必需引脚指示器 :引脚现在有绑定到执行剔除的必需指示器。带有未连接的必需引脚的节点将自动从图表执行中剔除。
-
属性列表视图复制/粘贴 :你现在可以选择属性列表视图内容,并将其以逗号分隔内容的形式复制粘贴到外部应用程序中。
-
多行节点标题和干扰性更低的重命名支持 :我们完全重新设计了节点标题,以提供清晰的信息,并且现在只能通过右键点击菜单或按F2来重命名节点。
-
性能窗口 :我们向性能窗口以及搜索筛选器框添加了程序由开始执行到结束所用时间的信息,以在分析时隔离特定节点。
-
搜索窗口 :搜索窗口现在是递归的,将返回子图表中的节点。
-
内容浏览器中的图表实例 :你可以直接在内容浏览器中通过右键点击菜单从现有图表或其他图表实例创建PCG图表实例。
节点和运算符
5.4引入了多个原生PCG元素,包括:
-
匹配和设置属性 :匹配两个数据条目(例如点数据和属性集表)之间的属性值。在匹配的条目上,匹配数据中输入的所有属性都将被复制过来。当有多个条目匹配时,将执行随机选择,或者可以提供额外的权重属性,以更好地控制选择。
-
从对象路径获取属性 :现在可以从对象路径属性获取属性,包括数组、数组中的结构和子结构。解析的每个对象路径将返回扁平属性集表数据。
-
多切换和选择节点 :选择和切换节点,其可配置输入/输出选自可动态设置的整型值。
-
运行时质量分支和选择 :仅限运行时的PCG质量级别分支和选择节点,可以随必需级别扩展。默认输入/输出将用于禁用的质量级别引脚。已启用但未连接的质量级别引脚不会生成该质量级别的数据。适用于动态分支剔除。
-
数据标签操作 :按标签添加、删除或筛选数据。
-
属性转换节点 :尽可能转换为所需类型(布尔、双精度、浮点、整数、名称、向量等)。
-
逻辑节点 :Data Count、Point Count、Filter data by Attribute or Index和Get Loop Index。
-
纹理取样器 :允许在Get Texture Data之后更轻松地进行纹理取样。Get Texture Data还支持Tex2DArray和CPU纹理取样。
-
按属性对点排序 :适合用于按密度、比例或任何属性对点排序。有助于在Attribute Partition节点之前强制实施特定顺序。
-
原生创建点、创建点网格和相邻点 :在多个示例和早期用户逻辑中频繁使用的早期蓝图元素的快速原生版本。
-
点操作(复制点、拆分点、向边界应用缩放、合并点、重置点中心) :用于操控点数据的多个新节点。
-
打印字符串 :在日志中以及在屏幕上和/或直接在节点上打印自定义字符串或属性值。在调试图表时很有用,并可用于在编辑时向用户警告不支持的工具行为或数据。
-
可视化属性 :直接在世界中的点位置打印属性值。可以在节点上配置自定义前缀、点索引、属性名称、偏移、颜色和时长。
属性集表
PCG属性集表可以通过Actor属性Getter函数从图表参数、蓝图结构和数组创建,或从PCG图表中的多个属性集构造。
这允许从带有其资产集的群系等公开参数驱动更复杂的逻辑。
多个属性操作已更新,支持筛选器、添加和复制属性等概念属性表。还添加了 Attribute Set to Points 和 Points to Attribute Set 转换节点。
反馈循环
通过PCG图表输入/输出节点中新的可配置的每引脚 使用情况(Usage) 选项,循环子图表现在可以从反馈引脚获得每个循环迭代的重新进入数据。
在反馈输入引脚之外,在父图表中的Loop subgraph节点上可见,可以使用第一个迭代的数据初始化,而输出反馈引脚将返回最后一个迭代的结果。
为了进一步改进循环和反馈循环,还提供了新的Get Loop Index节点。
递归子图表
PCG图表现在可以作为子图表递归运行自身来创建分层逻辑,方法是将父图表执行中的数据传递给子递归。只要向递归子图表提供数据,就会发生递归。
PCG群系核心插件利用了这一概念,并可用作示例,每个主要的点都可以有自己的子项层级,这些子项全部通过相同的递归子图表处理。
使用此功能需要通过图表逻辑执行保护,防止无限递归。
群系核心插件(试验性功能)

PCG群系核心插件是一种数据驱动型系统性群系生成器,完全使用PCG框架构建。它展示了最新的改进,可用作制片的世界构建工具的高级示例。它是独立的,可以按原样使用,作为起始点或进行自定义。
群系核心是使用资产和群系定义的固定管线,同时设计得非常灵活,将关键组件(例如取样、变换和筛选)划分到单独的问题空间。其中每个都可以使用PCG框架根据项目约束或需要完全自定义。
提供初始设置后,美术师和设计师可以轻松定义世界中的群系,而无需编辑图表或复杂逻辑。
PCG群系示例插件是PCG群系核心的初始设置示例。它旨在帮助理解如何提供定义数据资产,使用提供的类和构建生成器、筛选器和变换图表。
原生关卡到PCG数据资产
关卡到PCG数据资产 操作输出一个PCG数据资产,其中包含表示选定关卡中找的所有静态网格体和实例化静态网格体的点数据。针对导出的数据中的每个点,会写入变换、网格体、材质、边界、Actor层级、相对变换和所有用户集Actor标签。它使用新的机制导出到PCG数据资产,并可以扩展。
使用新的Load PCG Data Asset节点或将导出的PCG数据资产拖放到PCG图表中,包含的表示源关卡视觉效果的点数据不仅可用于生成,还可以通过标签筛选、层级或任何逻辑在生成之前进行修改和操控。这提供了对装配件的手动艺术控制,然后可以程序化使用和修改这些装配件。
PCG装配件工作流程最初在电子梦GDC演示和示例中展示;它也用于《乐高堡垒之夜》世界创建系统。此原生版本将之前的资产操作工具蓝图替换为了更好的导出和更新选项、其自己的PCG数据资产类和特定Load PCG Data Asset节点。
动态属性追踪

动态属性追踪允许在修改外部引用的数据时触发图表更新。这包括数据资产、数据表、蓝图公开的变量、图表参数、图表实例设置和PCG设置更改,这些更改基于Getter函数触发的更改,以带有特定Actor标签或类和地形的自身、父项、Actor为目标。
分支执行剔除
静态和动态图表执行分支剔除可去除不必要的处理,极大地提高了性能。
执行剔除在将Branch节点用于下游元素时自动应用,并适用于在运行时动态设置的分支条件。
我们还使用必需引脚指示器更新了PCG节点。剔除还将应用于带有未连接的必需引脚的节点,而无输入的节点(例如Getter函数)将始终执行。自定义蓝图元素输入引脚也可以配置必需的引脚选项。
动态子图表
子图表节点现在可以通过其子图表覆盖引脚接受任何现有PCG图表的对象路径属性。它支持根据上下文动态更改图表,可以在从编辑器到运行时的任何时间执行。
子图表节点中没有设置图表时,将使用默认的输入和输出引脚。如果设置了图表,它将在覆盖时成为子图表节点引脚的模板。
代理节点
代理节点是通过设置覆盖引脚从对象路径属性集间接进入PCG设置的方式。它支持根据上下文动态更改在从编辑器到运行时的任何时间执行哪个节点设置。
代理节点可以使用原生元素类、蓝图元素类或特定设置来模板化。
临时预览模式
作为PCG组件上的选项,预览(Preview)和设置加载时预览(set Preview on Load)编辑模式会在本地生成临时构件和数据。
使用这些模式,你将能够在本地测试更改,而不会破坏现有数据,并决定何时应该更新数据。它还会根据需要将更新推迟到手动或构建机器过程,同时为所有用户保留实时编辑和预览,从而防止多个用户更新共享PCG内容时的争用。
PCG离线构建器
PCG世界分区构建器可以在关卡中生成PCG组件并保存结果。它可以从控制台或从命令行运行。此过程还适合作为自动化作业在构建机器上运行。
该过程会完全加载关卡,等待异步过程完成,例如静态网格体构建和其他操作,然后在匹配的PCG组件上安排生成。所有生成完成后,该过程会保存关卡并退出。
带参数的命令行示例:
UnrealEditor.exe ProjectName MapName -Unattended -AllowCommandletRendering -run=WorldPartitionBuilderCommandlet -Builder=PCGWorldPartitionBuilder -IncludeGraphNames=PCG_GraphA;PCG_GraphB
控制台命令示例:
pcg.BuildComponents -IncludeGraphNames=PCG_GraphA;PCG_GraphB
多数据属性操作
所有属性操作节点现在支持所有输入的多数据,可以持久保存单独的数据,同时将相同操作应用于全部数据。在之前的版本中,属性操作仅限于单个数据,这会强制实施成本高昂的数据合并,或因许多重复操作造成图表凌乱。
水体样条线互操作
PCG水体互操作额外插件添加了 Get Water Spline Data 节点。水体样条线上的取样将扩展到河流宽度,并写入特定于水体样条线的元数据,例如Depth、WaterVelocityScalar、RiverWidth和AudioIntensity。
平台
移动渲染器
虚幻引擎5.4中的移动渲染器带来了多项改进:
-
GPUScene内存和性能优化,改进了自动批处理并减少了绘制调用数量。
-
动态光源渲染性能改进,支持许多局部光源。
-
Android的按需PSO缓存。
Android平台
虚幻引擎5.4引入了多项Android平台特有的新功能:
*从启动程序安装构建的UE附带x86_64架构二进制文件,为开发人员简化了部署到Android x86_64目标的工作流程。
- Android模拟器支持(试验性)。这可用于从Android Studio提供的模拟器运行使用UE创建的游戏。
移动端Lumen(试验性)
使用桌面延迟渲染器在最新移动设备上提供对Lumen的试验性支持。
Apple Vision Pro支持(试验性)
我们预计在5.4中发布对Apple Vision Pro的完全沉浸风格(完全沉浸)的试验性支持。利用这一初始实现,虚幻引擎支持通过Metal进行立体渲染,以及由头戴式显示姿势驱动的摄像机变换。
Mac上的像素流送
WebRTC像素流送目前支持Windows和Linux。未来开发将在x86/ARM Mac设备上启用软件像素流送。硬件加速的像素流送将在基于ARM的M系列Mac上可用。
音频
MetaSound
MetaSound 在5.4中已 可用于生产 。尽管MetaSound仍在大力开发中,并规划了许多功能和改进,但它们已经在Epic Games中的所有游戏中得到应用,其中许多游戏从一开始就是在MetaSound上构建的。为了实现这一点,我们做出了许多性能和内存改进,并计划实现更多功能。
-
构建器API 改进
-
构建器API是一个蓝图脚本API,允许运行时的游戏以及编辑器工具程序化构建MetaSound。
-
它们随UEFN的Patchwork发布,在5.4中有许多改进,包括实时更新图表。
-
-
内存 和 CPU 改进
-
运算符缓存功能(用于缓存运算符内存的可选功能,可在编译MetaSound时进一步减少CPU命中)。
-
全面的性能和内存改进。
-
-
编辑器工作流程 改进
-
内容浏览器中的空格预览。
-
MetaSound编辑器中频谱和示波器的音频可视化。
-
用于像蓝图那样在MetaSound中搜索的查找(Find)选项卡。
-
编辑器细节面板和图表成员菜单默认显示更多信息。
-
MetaSound预设图标将恰当地显示预设图标,而不是MetaSound源图标。
-
细节面板中的只读属性现在可以被复制。
-
声音衰减的编辑器内实时更新
虚幻引擎5.4现在支持在编辑器中播放时实时更新声音衰减(Sound Attenuation) 设置。这可在编辑器中时更新衰减设置,而不必重新播放。
动态子混音
子混音(Submixes) 是DSP图表,可帮助你将多个源混合为单个输出。在5.4中,你可以从蓝图中的子混音图表以及插件中添加和删除子混音。这为临时的插件内容或临时的Gameplay内容提供了灵活的子混音图表。
Audio Insight(试验性)
新的 Audio Insight 插件将启用一个编辑器工具,供音频开发人员实时执行PIE会话的分析和调试。
-
提供源事件列表,其中包含关于多个源参数的可排序的列。
-
提供相关音频信息(音量、音高、距离等)的时间图。
-
提供可点击的列表项,用于在编辑器中查找播放的资产。
-
提供基于子字符串的筛选功能,允许实时将源设为独奏和静音。
-
提供所需子混音视图上的音频计量。
-
提供全局音频计量和分析。
-
允许自动设置音频日志记录。
-
提供可自定义的布局。
Audio Insight 是5.4中的一项 试验性 功能。在未来版本中,团队还将推出以下功能:
-
独立模式。
-
连接打包游戏,包括移动端和主机平台。
-
录制和播放分析录制文件。
-
尾部录制文件。
Harmonix插件(试验性)
Harmonix 插件是虚幻引擎5.4中新增的插件,提供了一套可用于创建音乐Gameplay的工具和运行时功能。它:
-
添加了对导入MIDI文件的支持。
-
允许在MetaSound中播放MIDI文件。
-
可将MIDI事件流路由到为音乐Gameplay和音乐系统设计的各种新MetaSound节点。
-
为MetaSound提供新的软件取样器工具。
-
允许从游戏线程观察MIDI事件和时钟,将视觉效果和节拍匹配评分与渲染的音乐同步。
RAD音频编码解码器(试验性)
RAD的音频编码解码器( RAC )是新的多平台感知音频编码解码器,可实现比Bink音频编码解码器更好的压缩率、更快的解码和更高的质量。
建模
UV工具改进(测试版)
UV编辑是开发高效资产时至关重要的一环。我们更正了UV编辑器显示,可恰当地显示布局线框。
纹素密度(Texel Density) :现在提供了新的纹素密度工具,用于基于比例和纹理值将网格体的UV纹素密度设置为一致的值。
多个网格体显示(Multiple Mesh Display) :我们更新了3D预览,便于在选择时恰当地放置多个网格体。
建模工具(测试版)
建模模式工具是对所有网格体类型进行有效开发、编辑和质量管理的基础。虚幻引擎5.4包含一些迫切需要的功能和改进。
斜边(Bevel) :斜边工具现在支持细分,而不仅仅是单个倒角边缘。这有助于创建更加复杂、面向制片的网格体。
挤压边缘(Extrude Edge) :这个新选项现已在选择工具类别、多边形组编辑工具和三角形编辑工具中提供。
Harvest实例(Harvest Instance) :新的Harvest实例工具可从选定Actor创建新的HISM或ISM,加快创建过程。
删除多边形组边缘(Delete PolyGroup Edge) :删除多边形组边缘有助于在复杂的网格体上更快速地进行拓扑编辑。删除操作会执行类似于合并多边形组的函数,但提供了范围更广泛的拓扑更改,而交互更少。
建模工作流程(测试版)
建模工作流程需要高效的交互和反馈。所有网格体元素的选择、变换、对齐和显示对于有效的资产和世界构建至关重要。
网格体元素显示(Mesh Element Display) :我们在5.3中引入的网格体元素工作流程现在改进了未选择和已选择元素的显示。这样美术师可以准确获知哪些元素可供选择。
元素变换(Element Transform) :变换小工具现在有额外的功能,可支持网格体元素选择的对象轴。
创建形状(Create Shape) :形状工具现在提供了在原点生成新形状的选项,有助于快速创建网格体,而无需放置再重新定位。
如需详细了解建模模式,包括工作流程和工具,请参阅建模模式入门。
几何体脚本(测试版)
几何体脚本(Geometry Scripting) 是一个虚幻引擎插件,其中包含一组函数库,用于使用蓝图和Python生成和编辑网格体几何体。几何体脚本概念将不断使用更多函数进行扩展。
TransferBoneWeightsFromMesh :使用比最近点方法更强大的局部重绘方法,将骨骼权重从源动态网格体传输到目标动态网格体。目标网格体通常是没有之前权重的网格体(即从静态网格体转换而来)。
GetRootBoneName、GetBoneChildren、GetAllBoneInfo、GetBoneInfo 是用于收集骨骼信息的额外节点。
BlurMeshVertexColors 是类似于Houdini中的AttribBlur节点的新节点。
碰撞形状(Collision Shapes) :我们添加了用于直接操控碰撞形状的新函数,公开了碰撞合并算法和相关功能。
-
GetSimpleCollisionFromComponent
-
SetSimpleCollisionOfDynamicMeshComponent
-
GetSimpleCollisionFromStaticMesh
-
SetSimpleCollisionOfStaticMesh
-
GetSimpleCollisionShapeCount
-
AppendSimpleCollisionShapes
-
MergeSimpleCollisionShapes
-
TransformSimpleCollisionShapes
-
CombineSimpleCollision
-
ApproximateConvexHullsWithSimplerCollisionShapes
-
SimplifyConvexHulls
-
AppendSphereCovering
-
StaticMeshHasCustomizedCollision
点集(Point Sets) :我们添加了用于处理点集的新函数:
-
KMeansClusterToIDs
-
KMeansClusterToArrays
-
TransformsToPoints
-
FlattenPoints
-
UnflattenPoints
-
MakeBoundingBoxFromPoints
-
GetPointsFromIndexList
-
DownsamplePoints
-
OffsetTransforms.
样条线(Splines) :我们使用组件上支持对自定义范围取样的新方法改进了USplineComponent取样:
-
ConvertSplineToPolyLineWithDistances
-
ConvertSplineToPolyline_InDistanceRange
-
ConvertSplineToPolyline_InTimeRange SampleSplineToTransforms 和 ConvertSplineToPolyPath 现在也支持自定义范围。对于闭合样条线,这些范围可以封装,以便轻松流程地循环扫描各分段。
CopyMeshFromComponent 现在支持将网格体从几何体集合组件和实例化静态网格体组件复制网格体。
AppendTriangulatedPolygon3D 是用于对带有3D顶点的多边形进行三角剖分的新函数。
动态网格体(Dynamic Mesh) :我们改进了使用几何体脚本生成的网格体的动态网格体组件类。它现在对切线有更好的控制和默认行为,并支持在编辑器视口中使用'Show'标记渲染标准顶点颜色和碰撞形状。
更多信息请参阅几何体脚本简介。
纹理工具(试验性)
纹理是在虚幻引擎中创建体验时的主要组件。它们用于材质、UI、地形和模型开发。
试验性的纹理图表编辑器使用以节点为中心的设计。编辑器有一个可浏览的节点控制板,其中包含用于生成和修改纹理的一系列节点。纹理图表编辑器可以使用现有纹理、材质或材质函数以及数学节点和纹理子图表。用户可以将纹理图表与蓝图和编辑器工具控件组合使用,创建自定义工具来优化常见工作流程。
内容管线
交换框架用户体验
交换框架可以让用户更轻松地创建、扩展、参数化导入和重新导入工作流程,并将在不久之后对相关导出流程做出类似的改进。
交换简化了以下操作:编辑和存储导入设置、根据需求创建自定义设置,甚至是使用创建者或管线管理员的自定义导入行为扩展导入过程。
我们更新了交换的用户界面/用户体验,方便美术师和内容创作者与导入对话框交互:
-
引入了 筛选器 ,使设置对话框窗口更整洁。
-
添加了 预览模式 ,详细展示导入过程。
-
添加了 冲突视图模式 ,实现与旧版对等的选项。
FBX导入自定义(测试版)
使用交换框架,FBX导入的可自定义程度变得更高。
此功能允许美术师、内容创作者和管线管理员微调FBX文件格式的导入行为。
在5.4中, FBX资产的导入功能已经完善 ,但场景导入仍需要修改UI。但引擎仍会默认停用这两个功能。
USD规范覆盖
USD是一种用途广泛的场景描述文件格式,在3D行业的采用率日益增长。内容创作者和美术师用它在DCC之间传输3D内容,尤其是场景描述。它最初用于媒体娱乐行业,现在其用途正在扩展到游戏和其他行业,如汽车、建筑等。
UE扩展了对USD标准规范的覆盖范围,这为内容创作者拓宽了应用场景,使他们在将场景从DCC导入UE中时能够获得更流畅的体验。
在5.4中,我们扩展了规范覆盖范围,以支持:
-
碰撞 :UsdPhysicsCollisionAPI、UsdPhysicsMeshCollisionAPI
-
usdVol模式 :仅限OpenVDB资产
-
图元网格体模式 :UsdGeomCube、UsdGeomSphere,等等。
-
静态网格体细分 :带有OpenSubdiv的细分方案属性
-
绘制模式 :UsdGeomModelAPI模式
-
图元元数据
-
primvars:normals
USD导出扩展
支持导出的UE功能的范围有所扩展,这为内容创作者拓宽了应用场景,并提供了更流畅的体验。
在5.4中,我们扩展了导出功能以覆盖
-
烘焙的PCG
-
几何体缓存
-
嵌套骨骼数据
-
图元元数据
glTF导出/导入
glTF是一种常见的3D模型文件格式,用作3D生态系统中的交换格式,以及Web和XR应用程序的发布格式。在一些行业,尤其是Web行业,它是内容创作者和美术师的主要工作格式。
因为glTF功能的覆盖范围很广泛,内容创作者可在其DCC或发布应用程序中流畅、无损地交换模型。
美术师和内容创作者可以使用glTF交换格式在更大的生态系统中协同工作。该格式允许他们将模型从线上资产库导入UE中,或将其UE场景发布到适合Web的格式。
在5.4中,UE将支持最常用的glTF扩展。具体的重点是:
-
消除导入/导出隔阂 :我们调整了导出器,使其与导入器支持相同的扩展。
-
添加了可导出的材质扩展:
-
KHR_materials_transmission(薄半透明)
-
KHR_materials_sheen
-
KHR_materials_specular
-
KHR_materials_ior
-
-
添加了可导入的扩展:
-
KHR_materials_iridescence
-
KHR_draco_mesh_compression
-
MaterialX - Substrate和OpenPBR(试验性)
我们扩展了MaterialX导入,支持创建Substrate材质和转译基于OpenPBR的着色器。作为Autodesk标准表面和Adobe标准材质的后继者,OpenPBR表面描述由Autodesk和Adobe始创。
对Substrate的支持 将使美术师能够更逼真地表示其MaterialX着色器。对 OpenPBR 的支持使美术师能够在其项目中接触到日益成长的行业标准。
现在,美术师只要在启用了Substrate的情况下导入MaterialX,就能获得使用了更好的Substrate表示的材质,而不是旧版材质到Substrate的封装器。OpenPBR导入适用于旧版和Substrate材质,但提供更好的Substrate材质表示。
请注意,Substrate材质仍是 试验性 的功能。
框架
Character Mover 2.0(试验性)
Mover插件(也称为Character Mover 2.0)大幅改进了UE中的现有角色移动功能。这是十分庞大的改动,涉及代码库中的大量代码,从物理系统到动画,再到网络,不一而足。
这项工作的主要成果有:
-
支持 所有Actor类型 ,而不仅仅是角色。
-
帮助Gameplay程序员 专注于移动 ,而不用太关注复杂的网络细节。
-
通过 模块化 改进了系统的可扩展性和可自定义程度,同时 支持非工程师 自行实现角色移动。
-
扩展了Gameplay可能性 ,方法是废弃刻板的要求,改进与物理模拟的对象的交互。
-
支持其他系统也可以使用的 通用化回滚网络 模型。
Gameplay Interactions交互插件(试验性)
利用Gameplay Interactions插件,你可以将状态树和智能对象与上下文动画场景(以及其他功能)一起使用,在Actor之间创建完善又灵活的交互系统,允许状态树处理两种逻辑,即对象的逻辑和使用该对象的Actor的逻辑。
外部状态树子树(试验性)
对于状态树外部子树的支持和我们之前引入的子树功能相似,但它实际上是单独的文件,它可以在多个不同的树中复用,而不是仅限于当前树。这样内容创作者就能从多个已有区块构造状态树,这样实现的模块化行为可能更接近之前只能使用行为树实现的行为。
更多详情,敬请参阅外部StateTree快速入门指南。
大型世界坐标网络支持(测试版)
现在,UE的网络技术正式支持大型世界坐标,允许你在多人环境中创建大型世界,而不必担心触及网络相关的限制。
GAS调试改进
我们改进了许多可以用于Gameplay技能系统(GAS)的调试工具,以便你在使用这个出色框架时获得更多的内置调试机会。
仅限数据的蓝图合并(测试版)
虽然我们在5.3中引入了数据资产合并,但我们现在引入了新的功能,可以合并仅限数据的蓝图(而不是完整蓝图图表,这仍不受支持),以便全球各地的开发者在对比与合并其BP数据资产时能更清晰地了解其中的内情。
Windows GameInput API(测试版)
Microsoft最近发布了新的Windows GameInput API,使我们可以为Windows平台上的手柄添加更多"开箱即用"式连接支持。
这包括PlayStation手柄,且没有特殊的第一方许可证要求(SDK访问)。第一个试验性版本将支持以下手柄:
-
Xbox手柄
-
PS4/5手柄
-
赛车方向盘
-
飞行摇杆
-
街机摇杆
是的,这也意味着对UE中经典USB塑料工具的原生支持,这样就可以在你自己的游戏中(以及《Fortnite Festival》中)使用这些外设!
Iris复制(测试版)
虚幻引擎5.4带来了工作流程改进,以及对插件的易用性改进,使得Iris复制系统在任何网络环境中都更易使用和调试。
大型世界的寻路网格体生成(试验性)
在发布《Lego Fortnite》时,为了更好地支持更加庞大的动态世界,我们不得不优化了我们的寻路工具内的各个系统。因此,我们对可用的运行时生成调试工具做了大量改进。
我们还为调用器提供了更好的工具,并改进了寻路网格体分辨率,以便你使用这些概念调节游戏性能,并可以随时随地按需要的方式生成寻路网格体。现在,对于存在大量AI的大型开放世界,寻路网格体生成也不再是瓶颈!
最后,我们修复了寻路链接生成的一些问题,能够更好地支持世界分区和OFPA。
编辑器
Python 框架升级至3.11.x
我们将 Python 框架升级至 3.11.x 以遵循VFX 参考平台提供的建议。此次升级的目的是尽可能地减少行业中使用的不同软件包之间的兼容性问题。
多用户Actor复制
在多用户编辑模式下实时复制Actor。在独立事务不够用时,用户现在可以从世界及其属性整理出他们希望实时复制的Actor列表。
多用户远程函数调用
利用多用户远程函数调用,一个客户端可以通过多用户编辑模式在另一个客户端上调用,以执行预定义的C++和蓝图函数。
编辑器易用性:应用程序缩放(试验性)

用户现在可以使用 编辑器偏好设置(Editor Preferences)> 通用 - 外观(General - Appearance) > 用户界面(User Interface) 下的 应用程序缩放(Application Scale) 设置调整编辑器中UI元素的大小。
若将值设置为超过1.0,将按比例增大文本和UI功能按钮,使标签和值更易于阅读。
若将值设置为低于1.0,将缩小文本和UI功能按钮,这样可在屏幕上容纳更多内容。
UI系统
Slate PostBuffer(试验性功能)

UI开发人员现在可以更高效地使用UI材质对场景取样,并应用任意特效,例如全屏去饱和度和颜色偏移。这在之前不可行,因为SceneColor不对UI材质公开。在此试验性版本中,只有场景模糊特效可用,但未来版本中将添加更多特效。
如需了解详情,请参阅Slate PostBuffer文档。
你还可以从虚幻引擎商城下载内容示例项目,然后查看 UI_SlatePostBuffer 地图,探索Slate PostBuffer的示例。
UMG Viewmodel(测试版)
UMG Viewmodel 插件基于MVVM(模型-视图-Viewmodel)模式,使设计师可以独立于程序员工作,并能在不更改代码的前提下,对控件做出结构性的更改。
在此版本中,我们通过以下功能扩展了UI设计师和开发人员可执行操作的限制:
-
绑定到事件 :创建在事件触发时执行的绑定。
-
静态Viewmodel :直接在UMG中初始化Viewmodel的实例的值。
-
显示蓝图图表 :查看绑定的关联蓝图图表。
-
诊断 :验证和错误日志记录中提供了更精确的信息。
媒体
媒体IO实时MIP生成
我们现在公开了为媒体轨道实时生成mipmap链的功能,这可以改进渲染和视频图像的稳定性。新增的功能有:
-
可启用实时mipmap链生成的媒体轨道设置。
-
位于mipmap分段下的媒体板Actor复选框,使用它即可公开以上设置。
媒体IO EXR经纬度极Mip偏移
LED舞台上的虚拟制片用户在播放大型经纬度图块化EXR文件时,会在两级遇到更多的图块请求。这种情况通常发生在最顶部的nDisplay节点上,因为IO要求可能会跳过硬件能力,导致停顿或播放卡顿。我们现在提供了可通过媒体板Actor访问的优化系统,以自动增加请求的MIP级别并限制EXR图块请求的媒体板带宽。
-
我们添加了名为自适应极Mip偏移的媒体板Actor选项,用于自动调整MIP偏移,以使IO请求保持恒定。
- 这仅适用于球体配置中的图块化EXR。
媒体IO最小化TSR/TAA瑕疵

用于TSR和TAA时,视频播放和基于材质的动画会呈现出视觉瑕疵,例如脏污。尽管可使用实时MIPS和更高屏幕百分比来改进视觉降级问题,但这不足以生成所需的图像保真度。媒体IO最小化TSR/TAA瑕疵 可最大限度减少由于时间算法和运动矢量缺失所导致的明显瑕疵。全行业中使用任何种类的视频播放或流送内容的用户都可从中获益。
-
最大限度减少TSR和其他TAA导致的瑕疵(时间算法)。
-
为特别标记的几何体(例如播放板)提供时间传递。
制片渲染管线
渲染层

为了更好地在工作室管线内接入虚幻引擎,影片渲染队列现在能够轻松生成 渲染层(Render Layers) 作为后期合成的高质量元素。镜头可以分解到多个层来执行一些操作,例如将前景角色与背景环境分离,提供对最终图像的更大控制权,促进与实时操作板素材集成。路径追踪器和延迟渲染器都将支持渲染层。
影片渲染图表
为了帮助工作室将其虚幻引擎渲染使用扩展到越来越大的项目,影片渲染队列现在使用基于节点的新架构来管理渲染设置。影片渲染图表(Movie Render Graph) 为美术师和主管提供了基础构建块来定义渲染以及数据流和逻辑节点,构建出简单或复杂程度与需求匹配的图表,解决大大小小团队的需要。
美术师可以将图表设置为渲染单个镜头,或将图表设计为在复杂的多镜头工作流程中扩展。强大而直观的继承方案意味着制片可以在任何级别(无论是节目、序列还是镜头)构造分层渲染设置。图表系统还会将管线功能置于中心位置,通过方便、开发人员友好的入口点进行前/后脚本和自动化。
协议
DMX控制控制台

使用 DMX控制控制台(DMX Control Console) 有效驱动和控制大量灯具和调节器。它可简化DMX调试并让你快速控制一组虚拟的或实体的灯具。根据你的库和配接选择,自动生成并填充调节器。现场和虚拟制片行业的用户可以使用这些调节器生成DMX数据并发送给实体设备。
-
基于资产的基础架构 ,用于实现更好的UI控制和UE一致性。
-
多选和 配接分组 。
-
多配接选择不再显示多个灯具组,而是仅显示一个,类似于细节面板行为。
-
使用组内配接的文件夹嵌套,公开一组给定的调节器。
-
搜索通道历史记录 现在会记住用户之前搜索过的内容,用户不必总是重新输入。
-
搜索模板 ,用于快速搜索特定通道。由于给定配接的所有可能通道都已知,用户现在可以从中挑选,而不是随意搜索。
-
保存和重新加载Cue 以重新调用调节器状态的预设。
-
控制控件 ,用于获得更强大而直观的控制旋钮和控件。
DMX像素映射

DMX 和 像素映射(Pixel Mapping) 功能现在常用于更大的复杂设置,这些设置需要能够有效驱动大量灯具配接并对其进行像素映射。为了进一步简化像素映射器UX并帮助支持现场/虚拟制片用户,我们做出了以下改进:
-
用于实现像素网格准确性的网格系统 :你现在可以将配接对齐到网格。网格可以是任意分辨率(宽度和高度),无论输入纹理如何。
-
配接颜色方案现在取自DMX库 :这现在与控制控制台和库一致。
-
公开配接高亮大小 ,以便格外清晰。
-
配接旋转和水平/垂直翻转 支持更高的灵活性。
-
字体大小可扩展性 ,以便我们可以更好地读取配接信息。
-
高精度内部缓冲区 ,用于缩小规模、进行模糊处理和执行像素映射处理。
-
输入纹理的 线性度标记 支持。
DMX数据冲突监控
之前,用户可能不知道潜在的DMX数据冲突,因为没有集中式UI来查看和识别这种冲突。现在, DMX数据冲突监控 实现UI面板或窗口来公开所有当前正在发送的DMX子系统实例,例如控制控制台、像素映射器或蓝图。使用DMX的所有行业和用户都可从中获益,尤其是将工具组合用于像素映射器和控制控制台的行业和用户。
-
集中式UI面板或窗口,用于公开和集中所有并发DMX正在发送的子系统实例。例如,控制控制台、像素映射或蓝图的活动实例。
-
高亮每个配接的碰撞和冲突。
平台SDK升级
-
Windows
-
Visual Studio 2022 v17.4或更高版本
-
Windows SDK 10.0.18362或更高版本
-
LLVM clang
-
最低:15.0.0
-
首选:16.0.6
-
-
.NET 4.6.2 Targeting Pack
-
.NET 6.0
-
-
构建场编译时面向的IDE版本
-
Visual Studio:Visual Studio 2022 17.8 14.38.33130工具链和Windows 10 SDK (10.0.18362.0)
-
Xcode: Xcode 14.2
-
-
GDK
-
Windows SDK最低版本:10.0.19041.0
-
GDK: 2023年10月更新3
-
最新恢复版本
-
支持的IDE:Visual Studio 2022
-
-
Linux
-
原生Linux开发
-
推荐操作系统:Ubuntu 22.04或CentOS 7
-
编译器:clang 16.0.6
-
交叉编译工具链:v22基于clang-6.0.6 (CentOS 7)
-
-
macOS
-
推荐
-
最新macOS 13 Ventura
-
最新Xcode 14.1或更高版本
-
-
最低
-
macOS 13 Ventura
-
Xcode 14.1
-
-
-
EOSSDK
- 带1.16.2头文件的1.16.3二进制文件
-
Steam
- 1.57
-
iOS / tvOS / iPadOS
-
推荐
-
最新macOS 13 Ventura
-
最新的Xcode 14 Sonoma
-
-
最低
-
macOS 13 Ventura
-
Xcode 14.1
-
-
支持的目标SDK版本:iOS 15或更高版本
-
图形API:Metal 2.4和Metal 3.0
-
-
Android
-
Android Studio Flamingo 2022.2.1 Patch 2 May 24, 2023
-
Android NDK r25b
-
Android SDK
-
推荐 :SDK 33
-
用于编译UE的最低版本 :SDK 30
-
在设备上运行的最低目标SDK :SDK 26
-
-
如果你使用AGDE调试,需要AGDE v23.1.82+。
-
构建工具:33.0.1
-
Java运行时: OpenJDK 17.0.6 2023-01-17
-
-
Switch
-
SDK 16.2.3
-
最低固件版本:17.0.0-7.0
-
Nintendo Dev Interface 2.5.5
-
支持的IDE:Visual Studio 2022
-
-
PS4
-
Orbis SDK 11.508.011
-
系统软件11.508.011
-
支持的IDE:Visual Studio 2022
-
-
PS5
-
Prospero SDK 9.00.00.40
-
系统软件9.00.00.45
-
支持的IDE:Visual Studio 2022
-
-
ARCore
- 1.37
-
ARKit
- 4.0
-
OpenXR
- 1.0.27
版本说明
Animation
API Change:
- FSkeletalMeshObject::MinDesiredLODLevel is no longer clamped to the highest loaded LOD, so when mesh streaming is enabled MinDesiredLODLevel may reference a LOD that is not streamed in.
- ILODSyncInterface now makes a distinction between the LOD requested for streaming (if mesh streaming is enabled) and the LOD requested for rendering. SetSyncLOD and GetCurrentSyncLOD have been deprecated in favor of Get/SetForceStreamedLOD and Get/SetForceRenderedLOD.
New:
-
Added a function to UDNAAsset that allows it to be copied at runtime. This is needed for systems that dynamically generate meshes at runtime, such as Mutable.
-
Control Rig: Added key reduction/optimize for bool, int, enum channels when baking to control rig
-
Lowered the angle threshold for flagging bad BlendSpace triangulation from 4 to 1 degree, to reduce the chance of bogus warnings.
-
Add an option to enable/disable each BlendSpace sample when using "analyse all"
-
PerformanceCaptureCore plugin** This experimental plugin add two new actor components and two new actor classes to replace animation blueprint workflows for motion capture:
- Performer Component: Should be added to skeletal meshes that bone-for-bone match an active LiveLink subject. The Performer Component let's you choose a skeletal mesh (defaults to the one closest to the root component) and a LiveLink subject. The component overrides the animinstance on the chosen skeletal mesh and ensures it is driven by the LiveLink Data.
- Retarget Component: Should be added to an actor with a skeletal mesh. Allows the user to choose a source and a target skeletal mesh component (the source can be part of an external actor) and an IKretarget asset to copy animation between the source and target.
- CapturePerformer Actor: A skeletal mesh actor containing the Performer Component functionality.
- CaptureCharacter Actor: A skeletal mesh actor contain the Retarget component functionality and BP scripting API to control the retargeting properties.
-
Motion Extractor Modifier: Added space enum to allow calculating motion relative to another bone.
-
Improving packing on SkeletalMeshComponent which should get a 16 byte gain. This will cause SkeletalMeshComponentBudgeted to drop to the 4080 bin for all platforms other than Switch, getting 288 bytes back for each.
-
The LOD Sync Component now behaves correctly when mesh streaming is enabled
-
Converting from static mesh to skeletal mesh now allows setting the target path, swapping out suffix/prefix, and give a choice of where to place the root bone.
-
Add ForceNextTickThisFrame function to AnimationBudgetAllocator.
-
Improved memory usage estimation for cooking animation clips
-
Provide alternative orientation calculation method for BlendSpace analysis. This avoids problems when the pointing bone is not restricted to an "upright" orientation.
Bug Fix:
-
The default deformer setting is now retained when re-importing a skeletal mesh.
-
Fixed not being able to set the preview mesh for a multi-selection of animation assets in the sequence browser.
-
Fixed buttons in the BlendSpace details from disappearing when searching.
-
Added a new setting "Build Half Edge Buffers" to Skeletal Mesh Editor. It allows half edge data to be cooked with the Skeletal mesh asset such that deformer graphs using half edge data interface still work once the assets are cooked
-
Fix to get blending of control rig poses working when a sequence has multiple control rigs
-
Changed some calls to GetValueOnAnyThread from GetValueOnGameThread as RigVM can also be used in jobs
-
Fixed an issue in the skeletal mesh or skeleton editors where transforming bones or resetting them back to a default pose wasn't undoing properly.
-
Fix to AnimationBudgeAllocator that keeps tick rates consistent between tick prerequisites.
-
Fixed an issue where editing per-platform settings on the skeletal mesh details would sometimes leave the platform name as "None" instead of the actual platform name.
Deprecated:
-
Add OverrideMinLOD and deprecate SetMinLOD in SkinnedMeshComponent. - SetMinLOD requires bOverrideMinLod to be true for it to function, so adding a function that sets MinLOD and bOverrideMinLod to true.
-
Control Rig: Deprecated interaction rig as it's no longer used.
Gameplay
New:
-
blendstack support for automatic transitions in state machine
-
Find and replace feature for ChooserTable property references
-
Allocate temporary memory for chooser evaluation on the stack
-
Rewind Debugger track view improvements - Striped background - Track names in tooltips - Synchronized hover state - Object tracks now display lifetime with SEventTimelineView
-
Fix for rewind debugger scrubbing crash
-
Added icons for Proxy Tables and Proxy Assets
-
ChooserPlayer anim graph node
-
Drag/Drop Assets to add to ChooserTable
-
Add toolbar toggle buttons for auto Eject/Record features in Rewind Debugger
-
Fix for choosers and proxy assets that return classes (such as for selecting an Anim Class)
-
Added FootstepAnimEventsModifier to the AnimationModifierLibrary. Used to generate sync markers and notifies for any number of specified bones.
-
Property binding optimizations for choosers
-
ChooserTable Editor multi select and edit support
-
Add support for overriding PlayRate from within blend stack subgraph
-
Fix ChooserTable crash on asset reload
-
Improvements to anim node property tracing and display in the animation blueprint editor: - Trace selected animation for ChooserPlayer node. - Make debug bubbles in rewind debugger show all traced node properties, except Name. - Make sequence player nodes display the current sequence in the debug bubble. - Trace assets, such as Sequence or BlendSpace with the Key: Asset, and enable display of the Asset column in the AnimGraph rewind debugger details.
-
Anim Node Reference Tag support for nodes inside BlendStack subgraphs
-
Separating BlendStack from PoseSearch into its own plugin
-
Move camera shake-related headers into sub-directories, move legacy headers into separate directory
-
Support for nested Chooser Tables in the same file
-
Fix for end of lifetime tracing on linked anim graphs
-
"Any" setting for Chooser Enum Column
-
Fix settings in rewind debugger not saving
-
Enable visual logger rewind debugger integration
-
Optimizations for ChooserTable and Proxy property access
-
add multi-output support to proxy table lookups
-
Chooser Debugging with Rewind Debugger
-
Rewind Debugger Track Type filtering
-
Fallback result for chooser tables
-
Refactor chooser evaluation context to avoid memory allocations at runtime
-
Added support for filtering notifies originating from a blend stack.
-
Improve handling of Child AnimationBluprints in Rewind Debugger
-
Rename camera shake API parameter structs to make room for new ones
-
Auto eject on pause feature for Rewind Debugger
-
Clamp montage playback when stopping at end of section
Bug Fix:
-
Fix crash in proxy table editor when selecting the row after the last row
-
Fixed Rewind Debugger crash which could happen if starting PIE before opening the Rewind Debugger when auto-record is enabled
-
Fixed for stack overflows in rewind debugger related to animation setups with large numbers of curves
-
Properly build the duration of the composite shake
-
Add support for bitfield bool properties in chooser property access
-
Crash fix in ChooserTableEditor when deleting rows
-
Fixed warnings when opening assets from rewind debugger, and made animation assets scrub to the correct frame when opening via double click
-
Fix bug with property binding widget where it won't display anything if the only bindable properties are children of a UObject function
-
Fix for cooker crash with User Defined Structs in Instanced Struct data in Choosers/Proxy Tables
-
Make Rewind Debugger links to nodes in the AnimationBlueprint, from the AnimGraph track details, attach debugging to the correct instance when they open
-
rewind debugger optimizations - fix bugs causing treeview to refresh repeatedly, make curves tracks not update unless they are expanded
-
Fix native proxy table bindings not working
-
Fix crash when changing struct binding in Proxy Table Struct outputs
Movie Render Queue
New:
-
Exposed all OpenEXR compression formats to movie render queue outputs.
-
Exposed OpenColorIO CPU transform support in the movie render graph.
Bug Fix:
-
Movie Render Pipeline: Fixed selected shots not getting enabled in the queue when right clicking in Sequencer to Render Shot
-
Fix to allow MRQ to render water.
-
Updated the audio renderer to ensure the audio is correct when more than one temporal sample is used.
Rigging
New:
-
Deformer Graph: Changed the location of the checkbox for atomic operations and read access from "Set Resource" node to the Output Bindings on a kernel node. This allows a kernel to read from/perform atomic operation on its outputs whose type is int.
-
Added the ability to remove curves in the Curve Expression animation blueprint nodes. This can be done either by using the
undef()operator on the right-hand side of the expression, or by just prefixing the curve name with-(e.g.-CurveName) and omitting the rest of the assignment expression. -
Deformer Graph: Added support for automatically caching results of kernels whose output won't change. These kernels are marked in green color. Only kernels in the Update Graph are considered.
-
Added a project setting, r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences, that allows you to enable Unlimited Bone Influences in a project without compiling extra shader permutations for GPU skinning. This saves runtime memory, disk space and shader compilation time. When the setting is enabled, any mesh LODs using Unlimited Bone Influences that don't have a deformer assigned will use the DeformerGraph plugin's default deformer. This ensures that UBI meshes are always rendered with a deformer, and therefore the GPU skinning permutations for UBI aren't needed. This change also adds a per-LOD setting that allows users to disable mesh deformers on a LOD, which could be useful for controlling performance, e.g. disabling an expensive deformer on lower LODs. Some changes to functions on USkinnedMeshComponent lay the foundations for having different deformers on different LODs as well.
-
Added support for direct link between data interfaces in Deformer Graph
-
Control Rig: Allow runtime changes to control rig class in AnimBP. The Animation Blueprint node now offers functionality to change the control rig class used at runtime.
-
Control Rig: Command to load all control rigs. With the command line command ""ControlRig.LoadAllAssets" all assets in the current project can be loaded - helping with finding issues in assets.
-
Control Rig: Support for marquee selection in the viewport
-
Control Rig: Allow full compilation in PIE. Rigs can now be recompiled during PIE - which makes it easier to iterate on characters as they are in pose in the game.
-
The Base LOD parameter is now exposed on LOD setting data assets.
-
ControlRig Virtual Machine (RigVM) has been refactored to make it stateless and optimized to decrease the cost of creating instances (all instances of the same graph now share the VM). Also, the internal memory backing system has been changed to use instanced structs.
-
RigVM: Ray Math Functions. We've added "Intersect Ray", "Intersect Plane", a ray "GetAt" and "Transform Ray" nodes
-
RigVM: Enable profiling in release mode
-
Users can now convert a sub graph node into a reusable function that can be used in other deformer graph assets if its access specifier is set to public.
-
Moved some functions from RigVMBlueprint to the RigVMClientHost, so these are available for different users of the system through the client host interface
-
Added built-in Deformer Graph functions for Linear Blend Skinning and Dual Quaternion Skinning
-
Control Rig: Added editor only AssetUserData array to ActorComponent, SkeeletalMesh, Skeleton and RigVMHost. These will add editor only dependencies to the referenced data.
-
The Skeletal Mesh Modeling Toolkit plugin now includes all the same polygroup manipulation tools as the static modeling toolset.
-
Control Rig: Our standard function library is now exposed to UEFN #virtualized
-
ControlRig: added Parent constraint math Node
-
An arbitrary number of single-channel / alpha vertex maps can now be imported via FBX onto skeletal meshes.
-
Added built-in Deformer Graph functions for non-linear deformation including Bend, Squash&Stretch, Twist and Flare.
-
Added built-in Deformer Graph Function for Lattice Deformation.
-
Deformer Graph: Added support for math expression when setting the execution domain of a kernel
-
Added a new Control Rig node, Curve Exists, to check whether a curve actually exists on a skeletal mesh without evaluating it.
-
Fix Control Display actor always shows hidden controls
-
Control Rig: Added Pre and Post forward solve events which will be executed immediately before and after the forward solve. These events are useful when rig modules need to execute before and after a child module has been processed.
-
Disabled creation of deformer instances for dedicated server
-
Added support for loop nodes in Deformer Graph
-
Control Rig: Direct manipulation on nodes. Right clicking on nodes now allows user to interact with values on pins like vectors or transform directly. Node developers can also offer custom functionality, like for example with the Aim nodes.
Bug Fix:
-
Bind RigVMHost type so blueprint created callback can be called on control rigs
-
[Modular Control Rig]- Content only. Fix extra nulls that were showing up when someone uses the chain module causing clutter in the outliner.
-
Fix an issue with duplicated vertex data interface providing invalid data for mesh with more than 1 material section.
-
Get animation attributes working with control rig component
-
Fixed ControlRig VM hash calculation runtime cost by moving the hashing to compile time. The hash function cost has also been significatively reduced.
-
Fix Skeleton Data Interface node in Deformer Graph not working when the skeletal mesh is using unlimited bone weights
-
Fixed shader compilation error when connecting a parameter pin to a resource pin on a custom compute kernel node in Deformer Graph. This type of connection is now supported
-
Fix Deformer Graph editor crash when clearing preview mesh while the transform manipulator is shown in the viewport
-
Fix for ControlRig silently losing pin connections to UUserStruct members, when a member of the struct is renamed while being used by the rig
-
[Modular Control Rig]- Fix leg module to let user change the shape of the controls. Fixed a few other very small issues in the arms, legs, piston, addControls modules.
-
Fixed ControlRig VM compiler generating duplicated properties by reusing operands in inline functions.
-
Fixed assertion when editing a user defined struct used by a deformer graph before the deformer graph is opened/loaded in editor
-
Fixed a multithreading issue at Control Rig function registry, in order to avoid a deadlock when a VM is initializing in a thread while a different worker thread registers a function.
-
Fixed Skeletal Mesh Editor's LODInfo section not displaying new vertex attributes added via Add Weight Map Layer in Skeletal Mesh Editing Tools
Runtime
New:
- Changing the default animation curve compression codec to use ACL.
- This reduces the compressed memory footprint, and it improves decompression performance.
-
Runtime switching override physics assets on rigid body animation node using function library
-
Introduced new flag to ignore the RBAN LOD threshold CVAR and force use the one locally set on the anim graph node.
-
Exposed LOD threshold as a pin for the pose driver node
-
Blend Stack: Added per-sample graph support
-
Added support for skeleton compatibility in combination with blend profiles / masks.
-
Added the ability to add comments to curves on animations
-
Improved tooltip on CompatibleSkeletons in USkeleton
-
Added OnMontageBlendedIn callback to animation instance
-
New: Changed p.RigidBodyNode CVar from using TAutoConsoleVariable
to using a bool FAutoConsoleVariableRef instead. This avoids unnecessary calls to CVarEnableRigidBodyNodeServer.GetValueOnAnyThread(); instead, it uses the bool variable bEnableRigidBodyNode. -
Add possibility to expose the LOD thresholds as pins for the following nodes: Control Rig Rig Logic Skeletal Control Base (RBAN)
- Anim notify and sync marker workflow changes
- Skeletons are no longer dirtied when adding notifies and sync markers from animation timelines.
- Removing notifies and sync markers from the skeleton now does only that. To remove from animations, use the find/replace tab
-
Added the option to toggle the request forward behavior that is used by the in Inertialization Anim Node, and removed the request forwarding from DeadBlending Anim Node.
-
Respect bExposeNotifiesUICommands option in NotifyPanel in the skeleton and animation sequence editors
-
Only process a sequence once when adding multiple keys # jira UE-193618
-
Made Dead Blending Anim Node store pose and bone data sparsely according to which bones are present in the CompactPose.
-
Expose anim graph IsActive to anim node functions
- Updated the ACLPlugin to latest develop branch
- Source git commit: 5091b840185542fbe1cde5643c9c60448ae631fc
- This reduces the compressed memory footprint and improves visual fidelity.
-
Use UToolMenu for AnimNotifyTrack ContextMenu. This allows users to customize the menu and apply permissions.
-
New layers added to an anim layer interface will now start on a shared group by default, making them share instance at runtime, for better default performance.
-
Added support to rename blend masks and blend profiles in the skeleton editor
-
Added a new visibility-based tick option to the skinned mesh component that forces ticking montages and refresh bones when a montage is being played.
- Added the ability to run find replace on mirror data tables for an existing table. This functionality is useful if you have new bones or have changed your find / replace expressions for the table.
Bug Fix:
-
Fixed new anim state machine transition nodes not appearing when the graph is far from the origin
-
Switched to using FLazyName for control rig built in types
-
Fix function renames not applying to property access nodes and compilation crashes post-rename
-
Fix montages not being marked dirty when (e.g.) adding curve comments or changing curve colors
-
Fix notifies not being displayed in context menus under certain circumstances
-
Fix an infinite loop caused by requesting a start time outside the range of the animation by exactly the input DeltaTime
-
Fix for issue where anim streamable couldn't be created directly from anim sequence asset #changelist validated #virtualized
-
Fix budgeted meshes that are placed in levels not getting registered when playing as client
-
Fixed animation sequence editor details not showing the the list of bone animation tracks
-
Several improvements to reduce the likelihood of running into stack overflows when evaluating large AnimBPs.
-
Fix crashes when "call function" nodes are root-wards from a layered blend per bone node
-
Creating a montage directly from a sequence now respects the sequence framerate
-
Fixed not advancing sync markers properly if two or more markers are to be passed in a single tick.
-
Added curve debugger back to the skeleton editor
-
Fix URO-interpolated curves 'flickering'
-
Disabled MinKeysForResampling when resampling is not selected in anim compression settings
-
Fix to prevent anim montages from continuing to play animations past the end of the the last section.
-
Fix crashes around creating and deleting pose assets
-
Animation editor preview scene OnAnimChange delegate will now be called with the correct animation asset being set in the scene (or null ptr if preview is getting closed)
-
Removed curve compression codec instance GUID since it causes cook determinism issues and isn't otherwise required.
-
Fix animation attribute registration issues with attributes defined as user-defined structs
-
Fixed branching point notifies anim montages on load that were saved with a null LinkedMontage ptr
-
Added edit condition to disable anim per-track compression adaptive error settings when the features are not enabled
-
Add missing nullptr check on animation blueprint editor preview instance
-
Fixed an use after destruction issue at AssetEditorModeManager, if the PreviewScene has been already destroyed when the World cleanup takes place
-
Fixed crashes refreshing animation timelines
-
Fixed issue with Dead Blending Anim Node creating NaNs when encountering negative scales, and also made it so that the the LinearlyInterpolateScales flag causes scalar velocities to be calculated linearly. This allows for full support of negative scales when this option is enabled.
-
Switched missing bones ensure to be a logged error
-
Fix ensures and crashes when interacting with the Motion Matching node
-
Fix animation compression not dispatching when the curve codec is changed and the animation has no bone data
-
Fixed stack offset in AddErrorIfFalse to correctly report file & line that the error was emitted on
-
Newly-spawned anim instances now call BeginPlay overide points when they are spawned 'late'
-
Support pose watch when debugging parent or linked anim blueprints. Also prevent toggling pose watch from child anim bps
-
Fix crashes when creating property bags with identical layouts from multiple threads
-
Fixed crash setting a preview animation blueprint
-
Fixed recording of anim notify states in looping montage sections
-
Fixed custom property node delegate registation from the ALT to allow for async loading
-
Animation debug draw items now flush in both post update and post evaluate
-
Fix anim BP node orphan pins not getting removed on disconnection
-
Update compatible skeleton mappings when a ref skeleton is updated.
-
Update FRetargetingScope to ensure raw transforms have compatible skeletons applied
-
Fix crash initializing rigid body nodes for skeletal mesh components with no mesh assigned
-
RandomPlayer anim graph node now calls PreloadRequiredAssets.
-
Fix crash showing debug information for a blend space evaluator with no blendspace
-
Skeleton Mesh Linkup map has been refactored, in order to avoid leaving dead data in the LinkUpTable.
-
Allow Sockets to be added to Virtual Bones. Enable other functionality for Virtual Bones.
-
Moved LocalBlendCSBoneTransforms to use a TArrayView
-
Fix ACF_IntervalFixed32NoW codec format for translation/scale when used with linear key reduction
-
Fixed an issue with AnimSequences generating cook indeterminism due to curve names sorting.
-
Added AnimDrawDebugCapsule to AnimInstanceProxy for debug drawing purposes
-
Fixed crash reverting Skeletal Mesh unsaved changes while the asset is opened in the editor
-
Optimize common case of single full-weight entry in a blend list
-
Fix ensure when removing a notify track
-
Disable 'Add Socket' action in skeleton tree when a bone is not selected
-
Ensure that both notify and notify state properties are copied when copy/pasting
-
Fix recording/display of pose attribute debug info
-
Remove invalid ensures. Compatible skeletons means we can no longer guarantee that all bones within the pose asset exist in the skeleton.
-
GetLinkedAnimLayerInstanceByClass now optionally checks for Child class.
-
Expose bind pose scale to compression codecs. Update the ACLPlugin to use the bind pose scale.
-
Fix mesh space additive remapping to use the correct rotation fixup.
-
Optimized the opening of notifies/sync marker widget
-
Ensure that bones missing from an anim sequence still follow their parent when the sequence is a mesh-space additive just like they would if the bones were present in the sequence but not animated.
-
Fix to give smoother interpolation when evaluation frames are skipped. This is similar to the calculation used in the budget allocator.
-
Optimized various low-level parts of the anim blueprint runtime
-
Fix for crash when validating auto rule based transitions. Also reinstated some warnings as info
-
Fix error caused by unknown edit condition in twist corrective node
-
Fix incorrect BuildUnsorted overload being picked when compiling EngineTests
-
Fixed an assert being hit while ticking a montage with sync markers due to its position being modified outside of its asset player.
-
Fix curve debugger not working correctly with pose watches when connected to an external instance
- Fix edge cases around re-importing meshes with bones inserted into the hierarchy
- This adds a CVar (a.Skeleton.AllowIncompatibleSkeletalMeshMerge) to enable the addition of bones into the middle of skeleton hierarchies via import.
-
Fix for debug draw on blendspace player nodes when debugging parent anim bps
-
Fixed curve filtering option on DeadBlending on Anim Node.
-
Fixed issue when BlendProfiles and BlendModes were used in combination on DeadBlending Anim Node. Added bone filter to Inertialization node. Memory improvements to Inertialization node and some cleanup/deprecation of old code.
-
Fix unfixable warnings when variables referenced in in anim graph node pin bindings are removed
-
Fix for potential crash when retrieving anim attribute values
-
Prevent crash when attempting to create animation asset with invalid mesh/skeleton
-
Fix crash opening binding menus in state tree
-
RigVM: Fix pin-resolution behavior with already-resolved float and double pins
-
Fix issue where screen size property isn't correctly hidden in skel mesh details customization when driving LOD settings from data asset
-
Fixed blend spaces not syncing properly when using inertial blends. *Fixed blend spaces not syncing when using "Transition Leader" and "Transition Follower" sync group roles.
-
Fix blend list optimization to correctly check weight of single active pose
-
Fix node bindings not being present for nodes that are drag-dropped
-
Fix pasted 'anim getter' nodes introducing hidden references to their source anim BP
-
Fixed the animation editor renaming of float curves, that was returning error due to an issue in the name check.
-
Fix FMessageStack::HasMessage to properly account for popped messages
-
Fix bug with CurveSource node where it would affect curves not present in the curve source asset
-
Expose a native way to get the 'main' anim instance in a thread safe way, negating the need to nest property accesses to acheive the same effect
-
Exposed AddAnimNotifies publicly in FAnimInstanceProxy
-
Correctly use the key reduction thresholds in "Remove Trivial Keys" animation compression
-
Fixed accumulation of attributes not working properly when evaluating a pose from a slot node using time blend profiles and additive poses.
-
Fix crash when unlinking a linked anim layer that nests a linked anim graph
-
Fix debugging watched pins in child anim BPs
-
Fixed per-track compression to not allow selection of invalid scale formats
-
Fix for an issue where WheelController anim node wasn't updating upstream nodes in the anim graph
-
Fixed inertial blends originating from a BlendBy anim node not working with sync groups.
-
Fix "weighted moving average" mode in modify curve node
-
Fixed a crash when reloading a skeletal mesh while an animation sequence is open, due to a stored raw pointer in the PersonaToolkit
-
Fix montage preview of non-default tracks not firing notifies
-
Tweaked skeleton tree bone weight tooltip to better reflect the weighting of a bone
-
Add support for blendspace graph nodes to FBlendProfileCustomization::GetSkeletonFromOuter
-
Fix an invalid memory read when ACF_None is used as a rotation format in various animation codecs
-
Added clamping to the UI for "Remove Every Second Key" anim compression's Min Keys property
-
Fix GC crash with Sequencer anim instance proxies
- Assets (i.e. not umaps) with external packages now save correctly when saving from the content browser
Sequencer
New:
-
Sequencer- Allow materials to be referenced by material slot name rather than just by index. This prevents breaking resolution of material parameter tracks when materials indices get reordered within a mesh, as long as the slot names remain consistent. For now, we try to match by slot name first, and then by index if we cannot find a material by its slot name (or one doesn't exist in the binding for backwards compatibility). We also provide ways to refresh/fixup this binding in case material slot names or indices change. * Adding the ability to reference the OverlayMaterial in MeshComponents, and animate parameters in it, or change which material is assigned to the overlay material property using a material switcher track.
-
Sequencer: Add the ability to animate layer and function material parameters in Sequencer.
-
Sequencer: Tree View UX - Alternating rows have different tints, parents have different tints, make sure top level rows also report as a parent row, rows that have keys or sections selected also report as highlighted
-
Sequencer: UX changes for Playback Controls - new icons, info button, current time indicator.
-
Sequencer: Sequencer and Curve Editor Key Selection in BP/Python
-
Sequencer: Animation Mode: When reopening level sequence restore tween/tool states, recreate control rig as needed, and restore selection.
-
Sequencer- Added a track for animating custom primitive data on PrimitiveComponents. Custom primitive data is an alternative way of driving material parameters. It allows you to map any of 36 numbered float parameters on a PrimitiveComponent to one or more material parameters across multiple meshes and materials. You can apportion between 1-4 slots in a row to handle anything from scalar to color parameters. Previously these could only be set via code or blueprint, but now these can be animated in Sequencer.
-
Sequencer: Constraints: Animated constraints live in the level sequence
-
Add shared state structure for sequence hierarchies, with new "playback capabilities" container This lets external code (like level sequence actors or UMG widgets) specify what a given sequence instance can provide in terms of contextual information or logic. This is a first step towards removing the necessity for IMovieScenePlayer in core sequencer evaluation code.
-
Add grouping system to help with the common pattern of multiple contributors being grouped when animated the same target
-
Take Recorder: Add tokens (ie. day, month, take, actor) for animation asset and audio asset directories. Also, added tooltip information for what tokens can be used
-
In TakeRecorder, the audio device list is now more robust to devices going offline. A menu item has been added for refreshing device list.
-
Sequencer: Added Conform to Range in the right click menu of the timeline to conform the start/end range to the subsequence range.
-
Sequencer: Added a new interface that allows any UObject to implement an interface (either in C++ or BP) to receive events when Sequencer binds/unbounds that object. To get the events requires the sequence add a Binding Lifetime track to the binding. If the BindingLifetime track remains infinite in length, then the events will fire at the beginning and end of sequence playback respectively. If the binding lifetime track has a finite range, then the events will fire when entering/exiting the binding lifetime section.
-
Sequencer: Added SetCompletionModeOverride and GetCompletionModeOverride on the SequencePlayer.
-
Sequencer: Control Rig: Avoid issues with running PIE with the editor with Control Rig. Instead of sharing the same Control Rig in all worlds if there is a new game world we use a new instance of the control rig and set up/evalute that one in evaluation.
-
Curve Editor: Show first and last key's tangent handle on both sides. This is useful for example, if you have pre and post infinity set to cycle, you can manipulate the last key's leave tangent so that it's smooth to the first key's arrive tangent.
-
Fix curve editor stacked view mode not displaying single channel curves
-
Fix Curve Editor Curve Name node updating
-
Sequencer: Change bRestoreState boolean option on FMovieSceneSequencePlaybackSettings to an enumeration named FinishCompletionStateOverride with 3 values (Default, ForceKeepState, ForceRestoreState) with ForceRestoreState being the equivalent option to setting bRestoreState to true. bRestoreState was used to force PreAnimatedState to be cached for all items globally and then restored when the Sequence is stopped or is finished. When set to false, no such override occurred, and completion mode was determined per track section by the settings on each track section. We now have a 3rd option- ForceKeepState. If FinishCompletionStateOverride is set to ForceKeepState, then when the sequence is stopped or completed, we do not restore any state, regardless of track section settings- all state active when the sequence ends is persisted.This is done by discarding any preanimated state metadata and storage, preventing it from being used to restore state.
-
Sequencer: Constraints working with snapper.
-
Sequencer: Added the ability to move all the selected marks either by dragging or by nudging (ctrl-arrow keys)
-
Sequencer: Parse takes by asset name rather than shot display name. This allows you to rename the shot label and the takes which are name based, will stay intact. This also fixed a bug where when you change takes, the shot label doesn't come along with it.
-
Add logging and checks to diagnose unknown crashes around sequence instance creation
-
Convert slomo track to use the ECS evaluation
-
Add cached expansion state values to the curve editor tree so expansion state is restored when selection changes instead of defaulting automatically to a closed state. There are just saved per session, not in any asset.
-
Optimized reinitialization of double blender accumulation buffers
-
Sequencer: Make MoveSection virtual so that sections can implement how they want to be moved
-
Added suppressible dialog to prompt user to use audio clock source when audio is added to a sequence.
-
Upgrade camera shake tracks to use the ECS evaluation
-
Sequencer: Added support for component visibility in editor. There is existing support for the actor's temporarily hidden in editor property. This adds support for the component's visible in editor property.
-
Sequencer: Added missing BlueprintType to MovieSceneFolder so that they are exposed to Blueprints
-
Curve Editor: Show arrive tangent if previous key is cubic. This allows the arrive tangent of a constant key to be visible and manipulatable.
-
Sequencer: Anim Details: Per animator feedback we only select curves on the section to key section when there are multiple sections.
-
Make material systems use the new grouping system and benefit from hierarchical bias
-
Improve cinematic preview of camera shakes
-
Sequencer: New Auto/Smart auto with no overshoot. Set's Sequencer.AutoTangentNew 2 as default revert this value to "1" to go to previous behavior.
-
Sequencer: Linked Anim Instances. Delete links if we can't resolve(by loading) the object referenced.
-
Curve Editor: Changed Curve Editor tool time properties so that they display based on the user preferences (ie. frames, seconds, timecode).
-
Sequencer: Add pre/post cycles to integer and bool channels. Integer supports all but linear, bool supports constant(default), cycle and oscillate
-
Sequencer: Allow resizing subsequence track and template sequence track row heights
-
Sequencer: New Tween Tools for Blend Relative, Blend To Ease, and Smooth/Rough
-
Sequencer- Add a new 'SequencerAnimationOverride' interface for blueprint Anim Instances. This allows custom anim blueprints to either: a) Allow Sequencer to swap out their anim instance during playback (swapping it back after). This is similar to checking the 'Force Custom Mode' checkbox on a Skeletal Animation track section, but at the blueprint level without having to change anything in Sequencer. b) Provide a list of valid Anim Slot names for the Sequencer Skeletal Animation track section UI to choose from. When provided by a blueprint with the interface, a valid slot will always be chosen when creating new skeletal animation sections.
-
Sequencer: Control Rig: Fix setting zero value so it doesn't always add and uses default interoplation
-
Add option for choosing whether the camera cut track restores the original (pre-animated) viewport position on unlock.
-
Make the camera shake previewer aware of the world in which it should run shakes
-
Sequencer: Added a shortcut for Focus Playback Time, which focuses the view range on the current playback time without changing zoom level.
-
Movie Render Queue: Panoramic Renderer now respects the camera rotation by default. The original behavior can be restored in the Panoramic Render Pass's settings.
-
Add a Native Finished delegate for Movie Scene Sequence Player
-
Sequencer: Add support for animating material parameters on volumetric cloud component materials.
-
Upgrade visibility track to ECS evaluation
-
Movie Render Queue: Enabled the maximize button on the PIE window to allow increasing the size of the image preview.
-
Sequencer: Added FBX Export options for baking - Bake None, Bake Transforms, Bake Channels, Bake All.
-
Support multiple sequences for the dynamic binding BP extension.
-
Sequencer: Control Rig: Add priority order for Control Rig External Nodes. Allow for multiple Control Rigs on same binding.
-
Sequencer: Added GetNextKey/GetPreviousKey functions which are exposed to SequencerOutlinerScriptingObject. Also, GetNextKey/GetPreviousKey now operate within the the sequence's time bounds (which can be restricted to the selection range).
-
Sequencer: Pose Library: Blend float/vector2d controls.
-
Sequencer: NLA: Split Sections will inherit root motion matched location.
-
Control Rig: Control rig track order set by python/bp and set default to 100. Allow for multiple Control Rigs over same bound object.
-
Add option to disable auto-arranging of camera cut sections
-
Sequencer: Allow dropping actors that haven't been possessed into folders in Sequencer
-
Sequencer: Add shortcuts for Clear Global Marked Frames and Show Marked Frames Globally
-
Sequencer: Allow MovieSceneByteProperty tracks to find UEnums nested in structs in order to properly show the UI for animating these enums.
-
Sequencer: Added SetLoopMode/GetLoopMode to LevelSequenceEditorBlueprintLibrary.
Bug Fix:
-
Sequencer: reset director blueprints in UMG when stopping an animation
-
Sequencer: Control Rig: Fix crash with adding CR to anim bp instances due to skeleton not existing in initialization.
-
Don't call CleanTaggedGarbage twice on systems that happen to belong to multiple phases.
-
Curve Editor: Fixed the Transform tool not working with the Scale Center option.
-
Sequencer: Fixed PasteBindings not returning the actual pasted bindings.
-
Sequencer: When baking, check that the bake data is valid. The bake operation bakes from start to end frame inclusive. In the case of a spawnable in a subsequence, the spawnable won't exist for the end frame, so there is no bake data, in which case we use the default transform.
-
Sequencer: Fixed dragging multiple sections on different rows.
-
Sequencer: Fix leaking pre animated state for tracks set to keep state. Looping sequences with spawnables in subscenes could cause memory to continually get allocated in pre animated storage for each time spawnables were created. This was occurring for sections that were set to 'Keep State'. Even though states were not being cached, memory was being allocated in the cache tied to the object keys because 'MakeEntry' was being called. This memory was not even required as we weren't ever caching into it or restoring state. To fix this, logic has been reorganized in the CachePreAnimatedState functions to check whether we are meant to be tracking state before creating entries.
-
Sequencer: Fixed show Selected Nodes Only not always showing the selected actors if the bound object's name wasn't the same as the binding name.
-
Sequencer: Fix issue with possessable tracks that map to spawnables. If the spawnable despawns/spawns, the possessable track was not getting correctly invalidated, and so was failing to reconnect after the spawnable respawns. In addition, update the label color logic so that if a possessable references a spawnable, and the spawnable is despawned that we show a 'gray' color instead of red, just like we do for regular spawnable tracks.
-
Movie Render Queue: Fixed an issue where canceling a job would report as a successful job for some callbacks.
-
Sequencer: Fix memory stomp that was leading to crash on undo/redo of Control Rig Constraint Bake.
-
Sequencer: Fixed shot name being erroneously carried over when switching takes and creating new takes.
-
Fixed an issue in TakeRecorder where an unavailable audio input devices was not properly handled.
-
Curve Editor: Fixed jittery movement when manipulating keys.
-
Fix false positive assert from firing when an incorrect name is given to property bindings.
-
Sequencer: Control Rig: Masked controls may not key correctly since wrong control/mask index was being used. Also fix old CIS warning from Marc.
-
Fix a bug where, in some special circumstances, Sequencer would not cache the correct initial material parameter value
-
Stable sort sequencer outliner children to avoid weird reordering issues
-
Only set last known position on client-side initialization, to solve bug with replicated sequence that doesn't start at 0.
-
Speculative fix for crash during level sequence actor teardown.
-
Be more lenient in editor about invalid dynamic binding resolvers
-
Sequencer- Improve performance of searching for items in large sequences by keeping the Spawnables, Possessables, and ObjectBindings arrays sorted by FGuid and using BinarySearch where searching is necessary. Testing was performed on adds and searches in these arrays to ensure improvement (to searches). Adds are a bit more expensive, but should be alright in the vast majority of use cases. Iimprovement could be made if necessary to bulk additions by adding bulk operation functionality.
-
Don't run sequence updates when a client late-joins a level with stopped sequences
-
Sequencer: Fixed Ctrl+B not browsing to asset when Sequencer is open.
-
Seqencer: Add Evaluate to Integer channel
-
Sequencer: NLA: Fix match with next not working with blend options.
-
Sequencer: Control Rig: Remove auto compensation with space switching when we modify a channel, can lead to inaccuracies.
-
Sequencer: clear cache of UMG widget director instances when invalidating cached data.
-
Re-add FBX import/export menu entries to template sequences
-
Fix splitting/trimming of looping sub-sections
-
Resolve desired camera cut view target before checking if it's the same as the current one. This fixes some bugs when blending back to gameplay.
-
Better handle incorrect/unresolved camera bindings in the camera cut track
-
Anim: Return playing montage if there is one already playing. This fixes a bug where if a montage is playing when Sequencer starts, it doesn't return to that montage when Sequencer ends.
-
Sequencer: Import from Animation Root now imports keys relative to the current Sequencer time.
-
Fixed cleanup of invalid bindings by moving this logic from PostInitProperties to PostLoad
-
Movie Render Queue: Fixed an issue where MoviePipeline.h shadowed GetPipelineState which causes the MoviePipelinePIEExecutor to call the base implementation (which always returns uninitialized).
-
Sequencer: Fixed sequence getting marked dirty when closing a blueprint
-
Sequencer: Fix Exclude Default Property Tracks array so that it can include properties on components multiple times. CameraComponent.FocusSettings.ManualFocusDistance, CameraComponent.CurrentAperture.
-
Null check before synchronizing level editor selection.
-
Sequencer: Fixed sequence getting marked dirty when destroying a spawned object.
-
Sequencer: Constraints getting removed if we compensate out of a sequence boundary so need ot re-evaluate to make sure it's set up.
-
Sequencer: Fixed hierarchical easing channels being destroyed when still in use
-
Take Recorder: Fixed crash when using invalid character in the Animation subdirectory
-
Better handle incorrectly resolved object in dynamic bindings
-
Sequencer: Fix edge case where sequences with server-only or client-only subsections do not behave correctly with a single target executable for both server and client using TargetType.Game. In that case both server and client-only subsections stayed included. The fix is to detect when a sequence containing server-only or client-only subsections is being compiled for such a target, and mark that sequence as volatile, forcing it to be recompiled in those circumstances.
-
Correctly initialize bOverrideAspectRatioAxisConstraint.
-
Sequencer: Snapping: Constraints: Perform Euler filter when snapping/compensation static meshes
-
Sequencer: Fix default interpolation not being used on baking/loading animation onto control rigs.
-
Sequencer: Fixed rendering when scale transform changes signs (ie. positive to negative).
-
Fix camera cut flag not being set when spawnable cameras are the last in control
-
Sequencer: Fixed string array property values being incorrectly set with incorrect values.
-
Sequencer: Fixed soft object path BP nodes not being correctly populated from payload variables
-
Sequencer: Fix sync issues with replicated sequences while that sequence is itself animating the global time dilation. The code around calculating latency was not taking into account effective time dilation.
-
PR #10925: Fixed UserWidget's PlayAnimationForward and PlayAnimationReverse not playing animations if the animation was recently stopped. #contrib 10925
-
Curve Editor: Paste should paste should just paste onto the selected curves (or if none selected, derive the curves to paste onto). It shouldn't paste onto the hovered curves
-
Handle play-rate in replicated playback synchronization
-
Sequencer: Added missing EditAnywhere tags for ExportFBXParams which was preventing it from being visible in blueprints
-
Sequencer: Control Rig: Fix keying Rotator controls from Rotation Order fallout
-
Start tracking pre-animated state on new track instance inputs before stopping tracking on old ones
-
In Sequencer, the audio clock is now interpolated between frames resulting in smoother animation.
-
Seuquencer: Smart Auto hotkey missing in Sequencer
-
Sequencer: Remove copy relative option because it's a bit of a hidden feature and causes confusion when copying keys with the mouse hovered over keys at different times
-
Rerun Construction Scripts is now respected for any base blueprint class
-
Fixed registered tick interval not being reset when player was torn down
-
Curve Editor: Added shortcut to toggle lock camera command in Sequencer
-
Fix rendering issue where color property tracks in Materials were causing key areas to get culled due to mismatching outliner and trackview heights.
-
Sequencer: Changed numeric edits so that they are applied only on Enter (and no longer on focus change).
-
Sequencer: Anim Detail Fixes, reset to default and vector3d working #changelist validated #virtualized
-
PR #10839: Fixed disappearing root motion in template sequences. #contrib 10839
-
Curve Editor: Fixed mirrored text for Arabic.
-
Sequencer: Fixed snapping to section start/end points when resizing sections.
-
Curve Editor: Fixed the curve name being carried over when you change curves.
-
Don't cache the aspect ratio axis constraint if there's no local player
-
Sequencer: Make sure setting the last view target is done even in early out. This fixes an issue where if sequence 1 plays and cuts to camera 1, and the sequence 2 plays and also cuts to camera 2, it restores properly when the sequences finish playing.
-
Curve Editor: Fixed curve framing now always framing all curve point values.
-
Handle fully-overlapped sections when arranging camera cuts
-
Preserve camera shake instances across re-imports
-
Fix displaying of looping sub-sections
-
Sequencer: Added Modify() in SetSequence to fix the UI not updating when changing the sequence on a subsequence section.
-
Sequencer: Control Rig:Only reconstruct in game thread #changelist validated #virtualized
-
Sequencer: Added back missing drop shadow on text in sections.
-
Change how the sequence observer is queried to solve networking bugs related to observer info sometimes not being replicated in time for the client to use it to decide whether a sequence should be played or not.
-
Fix editor preview blending back to gameplay
-
Curve Editor: Fixed BakeInterval for FFT Filter.
-
Don't invalidate bindings when looking for an object
-
Curve Editor: Fix performance issue by refreshing the container on tick rather than in the getter functions.
-
Constraints: Use weak pointer to hold World in Constraint Subystem
-
Sequencer: Step to Next/Previous Mark now also steps to the next/previous global marked frames.
-
Sequencer: Fixed the color tint not carrying over when switching takes or duplicating a shot.
-
Sequencer: SetCurrentTime and SetCurrentLocalTime should force an evaluation if the current time is already the requested time. Users would expect an evaluation to occur.
-
Take Recorder: Fixed setting the animation track name from the animation settings.
-
Sequencer: account for non-zero playback start times when trimming/splitting sub-sequences.
-
Sequencer: Snapper: Don't include controls without shapes as snap objects
-
Sequencer: Disallow keying muted/disabled tracks.
-
Sequencer Scripting: Change to Get/Set View and Working Ranges to double precision
-
Restore camera cut view target even if the previous view target isn't valid anymore.
-
Sequencer: If there is a subsequence range, clamp to that rather than the playback range. Users want to be able to clamp the scrubbing to the bounds of the shot, rather than the outer playback range.
-
Sequencer: Fixed tracks/bindings getting sorted incorrectly when adding tracks.
-
Fix for a rare issue with replicated sequences running an incorrect update soon after their creation
-
Patch up bound object pointers in the property instantiator system when an object gets replaced
-
Fix some issues with replicated sequence playback
-
Sequencer: Tween tool not working on objects since Sequencer isn't present.
-
Curve editor sets new key attributes based on neighbour keys (previous or next key to the curve time), in order to maintain the existing curve keys
-
Sequencer: Fixed crash when binding overrides array change when using binding overrides during runtime.
-
Movie Render Queue: Fixed the Movie Pipeline in-game overlays using visibility bindings which created a blueprint warning when Property Bindings were disabled for a project.
-
Sequencer: Fixed nodes getting automatically sorted on undo.
-
Sequencer: Fix issue where Movie Scene Event UObject payload parameters were not properly creating references to the UObjects and therefore renaming those UObjects would not create redirectors and the references would be lost.
-
Fix a crash when recompiling a user widget while sequencer is open
-
Sequencer: Game mode playback would not turn back on gizmo's, do to editor regression, which now needs you to manully turn on widgets with game mode turned off.
Deprecated:
-
Sequencer: Deprecated bRestoreState and replaced it with FinishCompletionStateOverride. Blueprints that reference Restore State will need to be fixed up manually by adding FinishCompletionStateOverride.
-
Take Recorder: Changed PreInitialize, Started, Stopped, Finished, Cancelled, MarkedFrameAdded to multicast delegates. Deprecated delegates that the multicast delegates replace
-
Sequencer: Added Time Unit as an argument to marked frames commands. Deprecated existing functions: GetMarkedFrames, AddMarkedFrame, SetMarkedFrame, FindMarkedFrameByFrameNumber, FindNextMarkedFrame. Added new functions that have the old function's display names: GetMarkedFramesInSequence, AddMarkedFrameToSequence, SetMarkedFrameInSequence, FindMarkedFrameByFrameNumberInSequence, FindNextMarkedFrameInSequence
-
Sequencer: Fixed ULevelSequenceEditorSubsystem which was incorrectly marked as Blueprintable.
-
Sequencer: Deprecated Get/SetCurrentTime and Get/SetCurrentLocalTime in favor of Get/SetGlobalPosition and Get/SetLocalPosition so that units can be specified in frames, seconds, marks or timecode.
-
Sequencer: SequenceTimeUnit has been deprecated and moved to the MovieScene module as MovieSceneTimeUnit.
-
Sequencer: Deprecated SequencePlayer on the LevelSequenceActor. It can now be accessed through GetSequencePlayer(). #noqatesting
Synthesis
New:
-
[MLDeformer] Added PIE debugging support, and Rewind Debugger integration of the external morph targets. You can now connect the ML Deformer asset editor to a character inside a PIE session.
-
[MLDeformer] Add proper support for LOD, replacing the quality level setting. Each skeletal mesh LOD level can now have the ML Deformer applied to it. You can also have a lower number of ML Deformer LOD levels than skeletal mesh LODs.
-
[MLDeformer] Add support for multiple animations as training inputs.
-
[MLDeformer] Changed the framework and neural morph model from beta to production ready.
-
[MLDeformer] Added support for comparing ML Deformer models side by side inside the ML Deformer editor. The comparison MLD assets requires to be trained on the same skeletal mesh for it to work. They can use different ML Deformer model types though. Also added support for detailed searches for MLD assets inside the content browser. For example you can search for untrained MLD assets, or assets with specific input animations or property values. All those searchable properties start with a "MLDeformer." prefix.
-
[GeomCache] Added some virtual method to the tracks to sample at a specific frame directly (sample index).
-
[MLDeformer] Add support for output morph weight clamping in the Neural Morph Model. This is an extra safety feature to prevent potential extreme deformations when running the deformer on unseen poses.
-
[MLDeformer] Improve neural morph model bone mask generation.
-
[MLDeformer] Show the frame counts in geom cache vs anim sequence duration mismatch warnings.
-
[MLDeformer] Add an extra improvement to the handling of bindings in the ML Deformer Component. Also removed the quality level from the ML Deformer component as that isn't used anymore since we added LOD.
-
Added the ability to specify the parent of the world-space controls in Physics Control Component
Bug Fix:
-
[MLDeformer] Fixed some issue where just saved newly created assets would still be marked dirty after opening them again.
-
[MLDeformer] Fix some crash when pressing Undo in a specific case.
-
[MLDeformer] Fix some reimport issue when reimporting skeletal meshes.
-
[MLDeformer] Fixed a crash when enabling ML Deformer Framework plugin, but no ML Deformer model plugins, and creating a new ML Deformer asset.
-
[MLDeformer] Improved handling of delegate bindings, which could prevent crashes.
-
[MLDeformer] Fix a crash when saving a level after creating a character blueprint with Vertex Delta Model in it and a compute graph component.
-
[MLDeformer] Fixed a crash when packaging a project with a blueprint that has a VertexDeltaModel based ML Deformer inside it.
-
[MLDeformer] Fixed a crash when switching between NMM and NN and back to NMM models.
-
[MLDeformer] Fix some bug that reported crazy amount of memory usage in the UI and directly improved it by separating memory from asset sizes.
-
[MLDeformer] Fixed some crash blocker bug when creating a new ML Deformer asset and switching to Nearest neighbor model. #trivial
-
[MLDeformer] Crash fix when clearing the input animations array in the UI and when switching characters.
-
[MLDeformer] Fix sampling inaccuracies, which could lead to large deltas at certain frames. And some small parallel optimizations to make samplers slightly faster.
-
[MLDeformer] Some small tweak when detecting if an animation is the same length or not. - Fix in the Vertex Delta Model training, where it would fail when clicking Train, as the API changed but the python script wasn't updated yet. - Fixed a bug in the VertexDeltaModel where it wouldn't save the neural network. - Fixed a bug where the VertexDeltaModel extracted the wrong size from a tensor.
Editor
API Change:
- This still encodes and uploads a tiny black texture to the hardware.
New:
-
New "Asset Disk Size" tool (Tools | Audit > Asset Disk Size) for Unreal Editor which can load AssetRegistry.bin and .ucookmeta files from a cook and provide a variety of analysis options for investigating asset and plugin dependencies and their costs in terms of disk size. The tool allows you to ask questions like: "What is the marginal cost in terms of disk space for adding an additional asset to the game?" and "How much disk space would we save by removing this asset and any assets that it depends on (which are not used by any other asset)?"
-
Added angular speed units (deg/s, rad/s) for display in editor and conversion
-
Texture RenderTarget export to DDS file supports cubes, volumes, and all pixel formats.
-
Optimized loading of Asset Registry data in the editor, the initial asset scan should be significantly faster on large projects
-
Categories in the Message Log window are now sorted alphabetically
-
Add support for manual auto-complete commands in the Output Log console
-
Add r.Editor.NeverStartInPreviewMode Disable Preview Platform automatically if Preview crashed
- Added the ability to optionally run content validation during cook
- The following flags can be passed when running the cook commandlet: -RunAssetValidation. Run asset validation (EditorValidatorSubsystem) on assets loaded during cook. -RunMapValidation. Run map validation (MapCheck) on maps loaded during cook. * -ValidationErrorsAreFatal. Consider validation errors (from RunAssetValidation or RunMapValidation) as fatal (preventing the package from being cooked).
- Any validation errors are downgraded to warnings when running without -ValidationErrorsAreFatal to ensure that things looking for log errors or a non-zero return code don't consider the errors as failing the cook, and the "Cook.AllowContentValidation" CVar controls whether validation can run even if the flags are passed.
- These flags (-RunAssetValidation in particular) replace the older (and broken) bValidateAssetsWhileSavingForCook option in EditorValidatorSubsystem.
- New context menu options added to Spline Components:
- Closed Loop - Quickly toggle the Closed Loop property StraightenToNext - Quickly reset selected points tangent to align directly toward the next spline point StraightenToPrevious - Quickly reset selected points tangent to align directly toward the previous spline point ToggleSnapTangentAdjustments - Toggle behavior that would reset tangents when performing any Snap or Align action.
-
Engine (map and set add item); Implementing a way to have the map and set fill in with the next available enum value instead of always doing the default value. -- Code -- PropertyHandleImpl: FPropertyHandleMap::AddItem() - Added a HasKey() lambda. We're then checking if the map property's key is an enum property, if so, we'll loop the enum values to see if the map doesn't already have that enum value as a key. When we find one that isn't in the map, we're adding a child node and then setting the child's key node to be the enum value that is not in the map yet. If the map property's key is not enum then we do the old check for if the default key isn't there. FPropertyHandleSet::AddItem() - Added a HasElement() lambda. We're then checking if the set property's element is an enum property, if so, we'll loop the enum values to see if the set doesn't already have the enum value as an element. When we find one that isn't in the set, we're adding a child node and then setting the child node to be the enum value that is not in the set yet. If the set property's element is not enum then we do the old check for if the default key isn't there. UnrealTypes: FSetProperty::GetElementProperty() - Added this getter to return the ElementProp property.
-
Property Bindings: Add MaxDepth parameter to the widget so that systems can customize the maximum property depth to discover
-
Copy relevant warnings/errors to the texture editor window to avoid having to hunt them down.
-
The Editor's splash screen now includes information about module loading progress
-
Add tokenized search support for Searchable Combo Box
-
Added a category type that can be used with FMessageDialog to control the icon used by the in-editor dialog.
-
Imath: upgrade Imath to version 3.1.9
-
Added a context menu entry to perform asset validation on specific actors
- Added basic source control support to Content Browser file data sources
- This is enough to support the basic operations (on add, delete, move, rename), as well as the revision control file menu (to allow sync, revert, check-in, history, and diffing).
-
SCC: Fix Uncontrolled Changelist missing writable assets to reconcile
-
Editor | Add mechanism for extending the global status bar elements (Content Browser and Output Log buttons)
-
Added a content browser filter to only show the assets that are not used by another asset.
-
Make it possible to listen when the Status Bar Output Log is cleared
-
Add ImageCore::ResizeImage a high quality and fast resizer using stb_image_resize2. Old "ResizeTo" will be deprecated.
-
Texture RenderTarget create static texture and update texture now works with all pixel formats. Use the new GetRenderTargetImage API.
-
Scene Outliner: Add an option to mark a folder as the Current Folder on double click instead of expanding it
-
UnrealPak now uses the CookMetadata file to optionally write out size information for plugins. This information is written back to the cook metadata file, and is enable via a project packaging setting.
- Added FCoreDelegates::OnCommandletPreMain and FCoreDelegates::OnCommandletPostMain
- This allows things to hook in to provide additional initialization or shutdown logic for any commandlet that may be run.
- FCoreDelegates::OnCommandletPreMain is akin to FCoreDelegates::OnFEngineLoopInitComplete (which doesn't run for commandlets).
-
Add viewport client to the view modifier parameters so that subscribers know what viewport is being modified
-
The texture editor now clearly shows when the texture being viewed is not what will be used in the shipping game.
-
Added directory watchers for plugin root directories (instead of individual directories) in the Asset Registry to save memory
-
Added AssetRegistry.IgnoreEmptyDirectories console variable that can be enabled to ignore empty directories left behind by renames to improve load times along with several others for tweaking asset registry scan performance
-
Add new Texture asset actions in the right-click menu for textures in the content browser which can modify the texture source data stored in the uasset. Actions include changing higher bit depths to 8 bit, compressing the source with JPEG, resizing below a threshold size, and resizing to power of two.
-
Make r.InstanceCulling.OcclusionCull have ECVF_Preview flag
-
Add ECVF_Preview to cvar r.Mobile.AntiAliasing so it is previewable
-
New: Added support for removing (and optionally reverting) animation modifier(s) from a selection of sequences in the content browser.
-
Added metadata map to MetaHuman DNAAsset that comes with a Face SkeletalMesh.
-
Support setting actor picker with the currently selected actor in the level editor
-
GenerateStreamingInstallManifest - Add AllowPerChunkCompressionWildcard to allow pak files to opt into or out of being compressed through CompressedChunkWildcard. CopyBuildToStagingDirectory - Use bAllowPerChunkCompression to enable bCompressed to override global compression settings. This will correctly allow chunks to opt in and out of being compressed. NOTE: If DDPI specifies a hardware compression setting of 'None', this won't work as expected because there will be no global compression settings to opt in to. In this case, set
bForceUseProjectCompressionFormatIgnoreHardwareOverride=trueandbCompressed=Falsein [/Script/UnrealEd.ProjectPackagingSettings], then setup whatever project compression settings you would like chunks to be able to opt in to. -
2D Textures can now be marked as "CPU Accessible". This switches the texture from being usable by the GPU and allows the CPU to access the texture's source top mip. The format doesn't change.
-
OpenEXR: upgrade OpenEXR to version 3.2.1
-
Add cvar, Mainframe.ShowRestoreAssetsPromptInPIE, to allow re-opening asset editors when -PIE is present
-
Scene outliner and changelist window now sort entries by name in natural order
- Cooked Editor: Fixed an issue where the asset registry state of an cooked plugin would remove some of the needed development tags from an asset that might already exist in the EditorClientAssetRegistry data.
Bug Fix:
-
Fixed a crash in our Json serialization code that would happen when serializing an object with an empty string as a key.
-
Preview Platform message displayed only when Preview is Active displayed
-
Fix for dynamically sources textures going black when opening in the texture editor.
-
Make the ProcessClick behavior in the SCS Editor Viewport Client handle the ComponentVisManager in the same order as the Level Editor Viewport, making it easier to add custom tools and extensions to your editor. This will result in the right click behavior being evaluated in the same order as the level editor for more consistent options.
-
Fixed various crashes associated with editing a texture or otherwise changing the ddc key during a texture build.
- Clear the auto-save restore file after closing the main frame (and discarding changes)
- This avoids the auto-save restore prompt appearing if the editor crashes after the user has already opted to discard their pending changes during shutdown
-
Fixed soft-object actor references failing to fix-up when moving (via copy/paste) actors to a new world
-
Env. Light Mixer: Expose inner properties of SecondFogData when parent row is displayed
-
Removed old code that would incorrectly ensure if a raw memory address was reused for temporary maps in the editor
-
Fix for encode speed not showing up in the texture editor viewer on newly built textures.
-
Lots of various cook metadata fixes
-
Crash fixes for FConsoleVariablesEditorModule
-
Fix several bugs that would break Game Feature Plugins when changing the Asset Manager project settings in the editor
-
Made the paper2D on object reimported function safe to use in a cooked editor and made the existing code more robust by not crashing if we are missing the SourceTexture meta data.
-
Fix seamless travel not using the correct feature level
-
Fix undo history crash when temporary property not yet in object reflection data.
-
The content browsers path filters settings are now persisted properly per instance.
-
Fix PropertyHandleRotator crash when children not yet populated
-
Fix OverrideSP to work with the correct command line
-
Fixed an issue with the api of the asset definitions. The GetSourceFiles function didn't allow to resolve the source file paths in a way that is independant of the asset implementation details. This also fixes the issues where the editor is not able to find the source file during a reimport or simply navigating to that file via the content browser.
-
Fixed material editor crash when trying to restore previously open shader code tab before shader instances are populated
-
Removing texture build metadata.
-
Select All Actor of Class: Use full class path to avoid ambiguous results
-
Fix for typo in non pow2 volume texture mip count computation.
-
Fix crash in level editor context menu for delta transform to actors
-
Fixed incorrect scaling of tangents for meshes with non-uniform BuildScale. Note that the previous, incorrect behavior is still supported by a "bUseLegacyTangentScaling" flag on the static mesh asset, and already-imported assets will default to use that old behavior to avoid modifying existing meshes.
-
Fixed many bugs with displaying gamma correction of textures in the texture editor viewer and thumbnails. One side effect is that normal maps will now be shown the linear gamma, so they appear light blue instead of dark blue.
-
Property editor - Optimized performance when using a PropertyPermissionList to save several minutes of editor startup time
-
Re-enables video and audio capture on the Mac platform when using a media player asset in the editor.
-
Fix PropertyPathHelpers crashing due to missing vtables from incorrect pointer calculations
-
Fixed ComponentTypeRegistry blocking unload of ActorComponent blueprint classes
-
Fix bug where grayscale textures stored in TSF_G8 that used compression type UserInterface2D (EditorIcon) due to odd dimenions would output incorrectly as R8 and therefore appear red instead of gray.
-
Fixed bug where starting Play In Editor before the asset registry scan finished could break assets like Data Registries that listen for the completion callback
-
Don't allow 16Bit VALU for the Preview SP if the Editor SP does not support it
-
Fix Select All Actor Children was not part of a transaction
-
Fix the Game Feature Data UI to show an error instead of crash if one is created outside a plugin
-
Fix UnlitViewMode for Mobile Preview
- Editor: Fixed a bug when entering PIE and clearing selection, which attemps to clear selection on a spawnable that has been destroyed.
Deprecated:
-
Deprecate asset registry writeback after stage as we're running in to too many things that need information we no longer have after stage. Use asset registry writeback during stage if you need compressed package sizes.
-
Removing the AR Point Cloud plugin as it's no longer supported or maintained.
Content Pipeline
New:
-
Added a new translator for USD primitives types (like Cube or Cylinder). The generated meshes will use the same points and topology used by usdview whenever possible.
-
It should now be possible to isolate the session layer and it's Sublayers when right-clicking them on the lower panel of the USD Stage Editor window.
-
OpenUSD: upgrade OpenUSD to version v23.11
-
Alembic: upgrade Alembic to version 1.8.6
-
Fixed many issues with USD file format listings on save/export/open/reference/payload dialogs.
-
Improve handling of nested skeletal data (such as nested SkeletalMeshComponents or nested SkelRoots) when importing, opening and exporting USD stages.
-
Added support for handling skeletal attach sockets when exporting transforms to USD.
-
Setting material overrides on HierarchicalInstancedStaticMeshComponents generated for USD PointInstancer prims will have the corresponding assignment written out to the USD Stage, just like for other component types.
-
The "USD Stage" window has been renamed to "USD Stage Editor", and has been moved out of the Windows -> Virtual Production menu onto the top level of the Windows menu.
-
USDImporter: add support for the usdMtlx plugin on Mac The usdMtlx plugin that is included with OpenUSD adds a file format plugin for reading MaterialX documents and translating them into UsdShade shading networks. The plugin was already supported on Windows and Linux, and this adds support for the plugin on Mac.
-
Added support for importing and exporting prim metadata from/to USD, by storing it on the generated assets' AssetUserData.
-
Added some support for alternate USD draw modes as described by the UsdGeomModelAPI schema, including bounding boxes and cards and even animations of some properties.
-
Added a new UsdStageActor property and USD import option called "bReuseIdenticalAssets", that lets users disable the mechanism that shares the generated Unreal assets by hash when opening or importing USD Stages.
-
Added support for handling USD Skeleton prims with multiple root bones when opening or importing USD Stages.
-
Added support for exporting the output actors and components of PCG graphs to USD.
-
Added support for subdividing USD meshes via OpenSubdiv and pxOsd.
-
OpenSubdiv: upgrade OpenSubdiv to version 3.5.0
-
It is now possible to isolate session layers on the USD Stage Editor window.
-
Added support for USD collision APIs. Now the UsdPhysicsCollisionAPI schema must be applied to a mesh prim to enable it as a collider while UsdPhysicsMeshCollisionAPI can be applied to specify the collision approximation shape to use.
-
Added cvars under USD.StaticMesh.BuildSettings and USD.Nanite.Settings to control quality of static and Nanite mesh building.
-
Added support for parsing OpenVDB textures referenced by USD Stages as Unreal SparseVolumeTextures.
-
USDImporter: align sublayer manipulation API on FSdfLayer wrapper with USD API The utility functions in UsdUtils for creating and inserting sublayers perform additional work that may not always be desirable such as authoring a root/default prim, so wrapping the sublayer manipulation functions from the USD API allows direct access to edit sublayer paths.
-
Geometry caches can now be exported to USD.
-
When exporting static and skeletal meshes to USD, the old 'unrealMaterial' prim attribute will no longer be emitted, in favor of authoring material bindings with full USD Material prims with "unreal" render contexts. Using the 'unrealMaterial' string attribute on prims is now fully deprecated.
- Implemented the "StageState" property on UsdStageActors, that can control whether the currently opened stage is closed, opened, or opened and loaded (assets and components were generated).
- This property can be bound on external LevelSequences to easily control when to load the stage, or can be used to quickly open USD Stages via the USD Stage Editor without fully loading assets and components.
-
USDImporter: expose more type name-related functions of UsdPrim on UE wrapper This adds SetTypeName(), ClearTypeName(), and HasAuthoredTypeName().
- Right-clicking on a prim on the USD Stage Editor will now show a couple of new options on the bottom of the menu that allow adding or removing any arbitrary API schema, as well as quickly adding the most common API schemas.
Bug Fix:
-
Fixed how the mesh's material assignments were not being factored in for the asset hash when exporting static and skeletal mesh assets to USD.
-
Fixed how the right-hand panel of the USD Stage Editor wouldn't refresh in some situations.
-
Fixed how the "kind" prim attribute would be shown twice on the prim details panel of the USD Stage Editor.
-
Fixed a crash when importing USD Stages with LiveLinkAPI schema on a SkelRoot or Skeleton.
-
Fixed how morph target controls were not being generated when using Control Rigs with USD Skeleton and SkelRoot prims in USD Stages without skeletal animation.
-
Alembic: Static and skeletal mesh import now merge the non-unique material slots together. Each unique face set now translates to a unique material slot regardless of the "Merge meshes" setting.
-
Fix imported LevelSequences from USD Stages ending up with broken actor and component bindings on some scenarios.
-
Fix Sequencer tracks generated for animated USD Stages not receiving keys if the animation originates from a non-local layer (such as a reference or a payload).
- Alembic:
- Materials are now properly mapped on geometry caches when visibility animation is used. Now, the materials won't shift around when a mesh section is hidden. * Alembic import of geometry cache and skeletal mesh can now be interrupted.
-
Fixed MaterialX reference paths set up inside USD Stages being ignored in some situations.
-
Alembic: Import conversion presets have been renamed. Max/Maya preset names have been switched since their transform were reversed.
-
Fixed an ensure being triggering when parsing USD Stages with invalid UV set indices.
-
Fixed support for exporting LevelSequences with attachment tracks to USD.
-
The UnrealUSDWrapper module will now be automatically loaded if one of its static functions is called before the caller has explicitly loaded it.
-
Fixed how the File -> Export All option of the USD Stage Editor wasn't working for new stages.
-
Fixed incorrect skeletal mesh material assignments on meshes generated from USD SkelRoot prims whose Skeleton prim had a very high number of bones.
-
Imrpoved use of g room cache in Blueprint and Sequencer. Now it is possible to set the a groom cache through Blueprint and to add and set multiple groom cache tracks in Sequencer (for multiple groom components on the same actor).
-
Fixed some UX issues related to the USD Default Asset Cache dialog.
-
Fixed a crash when exporting USD layers to file paths that are invalid paths for the USD SDK.
-
Fixed how materials generated from USD were not updating after changing the reference material paths on project settings and reloading the stage.
-
Fixed a crash when the USD Importer plugin generated StaticMesh assets without any valid render data.
-
USD: Improved memory usage of geometry caches by properly unloading them when closing the stage.
-
Fixed how the File -> ExportAll option of the USD Stage Editor window would silently output layers to Engine/Binaries in some cases.
-
Texture2DBuilder shouldn't remove mips - this is unneeded, and in the use cases where the builder texture is reused as the final texture, causes issues.
-
Fixed a crash when repeatedly importing AnimSequence assets from USD in some scenarios.
-
Fixed a crash when trying to cook UsdAssetCaches with persistent StaticMesh assets.
-
USDImporter: fix allocator management scoping in UsdUtils::GetPointInstancerTransforms()
-
Fix strange joint rotation behavior when importing skeletons with negative scalings (such as mirrorings) from USD.
-
Fixed a crash when trying to parse SkeletalMeshes from USD Skeleton prims with no bones.
-
Fixed crash when using the Actions -> Import workflow with an UsdStageActor without a valid UsdAssetCache.
-
Fixed how it wasn't possible to package assets imported from USD for all platforms.
-
Fixed various crashes on corrupted files during content import.
-
Fixed some crashes when parsing Groom and GeometryCache assets from USD stages.
-
Fixed a crash when exiting the Unreal Engine with a loaded USD Stage actor on the level.
- Fixed how the USD Stage Editor would not update when the prims were modified during a Play-In-Editor session.
Datasmith
Bug Fix:
- Fixed an issue where double clicking on a Datasmith Scene asset wouldn't open its corresponding editor.
Framework
New:
-
Introduce validation for MustImplement meta tags for SPropertyEditorClass and SPropertyEditorEditInline to prevent non-interface classes being specified, and to protect against UInterface from being specified.
-
Return a proper error message when a user tries to submit a changelist containing files not mapped to the current stream.
-
Context Menu/SubMenu slate widgets can now be tagged
-
Reduce log spamming by making the 'scene viewport resized log' verbose.
-
Improved performance in the editor for allocation heavy workloads by slightly increasing the delay when memory goes back to the OS.
-
Add a new initialization path to ISourceControlProvider allowing the caller to customize the initialization logic and retrieve more info about the initialization itself.
-
Added tag metadata to items in New Asset menu of Context Browser
-
Material Editor: Added statistics for preshaders, and dumping of preshader expressions and parameter fetches in human readable form to the HLSL source. Preshaders are bytecode expressions generated from a material graph and executed on the CPU, to offload invariant work from the GPU -- inspecting them can be useful for debugging.
-
Return files not being marked for add due to P4IGNORE as errors rather than info.
-
Support MustImplement, AllowedClasses and DisallowedClasses filtering for EditInline properties.
Bug Fix:
-
Fixed ensure when editing CDO properties in FDataLayersBroadcast::OnObjectPostEditChange.
-
Ensure that the editor's PlayWorld context is valid prior to handling a request to end the current PIE session.
-
Fixed property clamping not taking into account the instance meta data if present on the property handle
Landscape
API Change:
-
Note : this API change is backwards-compatble both on the code and data side
-
Removed FLandscapeEditorServices, which didn't make much sense in terms of design wrt dependency inversion : instead, FLanscapeEditorModule is the one implementing ILandscapeEditorServices
New:
-
When calculating runtime virtual texture volume bounds, if the bounds align actor is a landscape, then we now include all of its child landscape components.
-
Fixed incorrect landscape CVar names
-
Water: exposed a function to set river transition materials from blueprint and added a water mesh update when setting these materials to ensure the new MIDs are set.
-
Water: Expose a method to set the far mesh material from blueprint on the water zone.
-
Fixed BP functions RenderHeightmap/Weightmap/s functions so that they don't require their transform and extents pin to be connected, since it's a supported case already. Also, made it explicit in the code that WeightmapScaleBias is not to be used, since it has a different meaning than HeightmapScaleBias. This was compensated by the FloorToInt32 that is done later, but still, it might avoid any future confusion to explicitly use a 0 bias instead (which is always true on weightmaps where there's no texture sharing).
-
Updates Landscape editor icons (BP Brush affects Heightmap/Weightmap/VisibilityLayer). Changes buttons to toggle buttons for landscape editor BP brushes affecting layers features. Updates landscape editor target list colors, padding, text color to reflect UE5 style.
-
Water: removed the serialized ExtentInTiles from the quad tree. This is now recomputed dynamically based on the size of the water zone to prevent potential mismatch and remove some ambiguous authority over the size of the water zone.
-
Added BP method to retrieve landscape target (paint) layer names
-
Moves GrassTypes from LandscapeProxy to LandscapeComponent. Allows the use of different GrassTypes between the proxy and components by using LandscapeMaterialOverride.
-
Water: Fixed exclusion volumes not updating water collisions when they are moved/changed. - Refactored the exclusion volume setting names so that they are more user-friendly. - Also supports a new mode which allows removing water bodies from the exclusion volume when including all.
-
Added system to invalidate VSM pages when using (non-Nanite) landscape, to hide shadow artifacts induced by the vertex morphing system of standard landscape : Relies on pre-computing max height delas from mip-to-mip for every landscape component Invalidation occurs when the evaluated max delta between the heights at the LOD value that was active when VSM was last cached is different enough from the heights at the current LOD value (for a given persistent view), based on a height threshold that is tweakable per landscape and overridable per landscape proxy Invalidation doesn't occur when Nanite landscape is used The invalidation rate is decreased as the LOD value goes up, controlled by a screen size parameter in the landscape actor (overridable per proxy), under which no invalidation will occur. This avoids over-invalidating VSM on higher LOD values, since they tend to occupy less real estate and therefore don't need to have perfect shadows Added per landscape (overridable per-proxy) shadow map bias to help with this problem too Added 3 non-shipping CVars to help tweak those 3 parameters in-game (landscape.OverrideNonNaniteVirtualShadowMapConstantDepthBiasOverride, landscape.OverrideNonNaniteVirtualShadowMapInvalidationHeightErrorThreshold, landscape.OverrideNonNaniteVirtualShadowMapInvalidationScreenSizeLimit) The whole invalidation system can be enabled/disabled via CVar landscape.AllowNonNaniteVirtualShadowMapInvalidation Added another CVar (landscape.NonNaniteVirtualShadowMapInvalidationLODAttenuationExponent) to tweak the screen-size-dependent invalidation rate curve shape Misc: Fixed landscape.DumpLODs command : now works without parameter and can be used several times Changed CachedSectionLODValues system for landscape to be usable both for ViewState-less views (one-shot renders like water info custom render passes) and "persistent" views (those that have FViewStateInterface associated). This allows to keep track of the previous frame's CachedSectionLODValues for a given persistent view and removes the previous hacky method Landscape UX fixes Fixed some landscape CVars which were not render-thread safe
-
New:** Expose Landscape force layer update to BP
-
Deprecated prototype-y function to change LOD settings on landscape directly on the render proxy : it's already doable in a normal fashion by invalidating the render proxy
-
Water: implemented support for a localized water quadtree when Local-only tessellation is enabled on the parent water zone.
-
Water: Expose an event on the water zone which is fired whenever the water info texture is created or recreated
-
Various UX improvments for landscape : Added an option to be able to consider the paint layer's hardness parameter when using the erosion tool. Set to false by default because this used to be misleading for users Set hardness to 0 by default for landscape layer info assets (for the same reason as above) Added several missing tooltips Added support for double-clicking on a paint layer thumbnail to open the corresponding landscape layer info asset
-
Nanite skirts improvements : when trying to maintain the slope at the edge by extrapolating the skirt vertex position, we now only do it if the slope is going downwards from the edge vertex to the skirt vertex (otherwise, in case of steep slopes, the skirt depth might not be enough to bring the skirt's vertex underneath the neighboring landscape proxy)
-
Implemented a new GerstnerWave shader and corresponding material function that supports splitting the wave spectrum into three buckets for low/mid/high frequency waves. This can be useful to filter out some of the higher frequency waves on lower end platforms in the material or utilize some interpolation instead of recomputing everything per-pixel for some frequency buckets.
-
Turned landscape brush size's max slider and max clamp value into project settings
-
Added RenderWeightmap/RenderWeightmaps BP functions to landscape in order to let users pack weightmaps onto the channels of a render target 2D (or render target 2D array), much like they could with heightmaps These can be called at runtime as they operate on the final weightmap data and they will render in a given world area, regardless of landscape component limits
Bug Fix:
-
Fixed ensure when painting/sculpting outside a landscape
-
Prevented computing the landscape texture hash twice when it has changed * Fixed landscape getting dirty even when the detected difference is lesser than the detection threshold
-
Fixes new landscape location/rotation/scale reset to default button not showing up when using the gizmos. Adds LandscapeEditor DetailsView RightColumnMinWidth to allow ResetToDefault button to be properly hit testable.
-
Fixed potential crashes in landscape code when iteration over garbage actor
-
Ensure the LOD level is within valid ranges when building Nanite landscape data
-
Fixed incorrect landscape components being rendered when doing a partial update of landscape edit layers
-
Fixed crash when updating landscape edit layers (account for missing layer data, like we do everywhere else in the code)
-
Made sure landscapes that belong to a level instance are not editable. The only landscapes that appear in landscape mode (and that can be updated) are now those that belong to the main level.
-
Disabled landscape.RemoveEmptyPaintLayersOnEdit by default since it causes more problems (landscape actors being dirty on load for no apparent reason) than it solves. We need a proper separation between editor and final data to solve this for good.
-
Fixed Per LOD material overrides not working on landscape streaming proxies
-
Fixes invalid ZOffset overflowing the grass exporter projection matrix.
-
- Automated LandscapeInherited/LandscapeOverridable enforcement of properties on the proxies so that using the meta-data on the landscape proxy property is sufficient to get the required behavior Changed list of overridden properties to a list of FName (memory optimization) Made bBakeMaterialPositionOffsetIntoCollision LandscapeInherited since that's how it is used Removed useless recomputation of normals when changing the scale when edit layers are enabled Fixed LandscapeInherited/LandscapeOverride properties which were not detected as such because we were using Property->Name instead of MemberProperty->Name Tagged all remaining ALandscapeProxy properties as either LandscapeInherited or LandscapeOverride Fixed landscape proxy overridable/inherited property names that didn't always appear readonly
-
Fixed landscape GPU readback pool not being depleted in most cases.
-
Changed "Mode" property in landscape import/export to either "Import Mode" or "Export Mode" to be more explicit to the user
-
Fixed landscape component count display in editor when selecting streaming proxies
-
Bugfixes for ULandscapeSplinesComponent::CopyToSplineComponent - Account for reversed spline meshes within non-reversed landscape spline segments - Added some QoL for auto detecting looping landscape splines
- Fix for landscape layer not being recognized as such when used within material layers
Deprecated:
- Landscape cleanup : Removed deprecated code from <=UE5.2 Moved UHierarchicalInstancedStaticMeshComponent::AcceptPrebuiltTree and UHierarchicalInstancedStaticMeshComponent::BuildTreeAnyThread to UGrassInstancedStaticMeshComponent
Scripting
New:
-
Allow overriding the name of an EditorUtilityTask
- Exposed DataTable column export names to scripting
- GetDataTableColumnExportNames
- Allow Python to be disabled entirely for certain commandlets
- This can be done by adding the following to any Editor.ini file: [PythonScriptPlugin] +DisablePythonForCommandlet=CommandletName
-
Allow all FillDataTableFromX functions to provide an optional row struct override for automated imports
-
Added an editor utility function for getting the asset 'root' directory - e.g. /Game/ in most projects, but sometimes $ProjectName
- Data Table automation improvements
- Always consider the FillDataTableFromX functions to be running an automated import when the optional ImportRowStruct is provided.
- Added GetDataTableRowStruct to query the row struct of an existing data table.
-
Added support for autocast functions for objects to support their super classes
-
Added bIsActionForBlueprints to UAssetActionUtility for better UX than needing to override a function
-
Add GeneratedClass API to Editor Utility Framework
-
SetEditorProperty/GetEditorProperty can now access class sparse data, and fixed arrays can be assigned to/read from dynamic arrays
- Exposed Data Table export to scripting
- ExportDataTableToCSVString
- ExportDataTableToCSVFile
- ExportDataTableToJSONString
- ExportDataTableToJSONFile
-
Added ResetEditorProperty to reset a given property back to its archetype value
- Exposed DataTable column utils to scripting
- GetDataTableColumnNames to get the raw property name of each column.
- GetDataTableColumnNameFromExportName to convert a friendly export name to its raw column name.
- Added the ability to wrap a Python object for use as a UPROPERTY on a UCLASS or USTRUCT.
- PythonObjectHandle allows Python generated types to store arbitrary Python objects as native properties, rather than rely on the lifetime of the Python wrapper object to keep a non-property object reference alive.
Bug Fix:
-
Fixed an crash when using the set editor property bp node on a property that might not be compatible with the pinned property type. The function PropertyAccessUtil::ArePropertiesCompatible was not robust enough and would crash in some case like using it to see if we can write a dynamic array to a static array property or the inverse.
-
Updated get/set_editor_property in Python to handle getting/setting the sparse class data for a CDO
-
Fixed Python Nativization failing to validate against an interface class
-
Update utility widgets to mark their child utility widgets as transient recursively. This prevents an issue where the level gets marked dirty by nested utility widgets.
-
Fixed UnpackReturnValues failing to correctly handle a None return value from a Python implemented function
-
Removed a bad assertion in UEditorUtilitySubsystem::RemoveTaskFromActiveList, and updated a similar check in RegisterAndExecuteTask to ensure we avoid duplicate task registration
-
Fixed an issue where the blueprint utility callable function DeleteAsset would fail to delete an asset due to being referenced by FBlueprintActionDatabase.
-
Sparse class data is automatically marked as bIsSparseClassDataSerializable when set from an editor utility - this prevents sparse class data from not being saved after it has been set by a script
UI
New:
-
Exposed 'use sections for categories' bool to the asset picker config - Added identifier to the expanded category (previously None)
-
Enable mobile platform stats in Material Editor by default
-
Made the editor splash screen movable.
-
[Output Log] The "Settings" dropdown menu now uses the Tool Menus system under the hood, enabling downstream/contextual customization.
-
Added option to force always compiling materials for mobile in material editor
-
Added Select All/None button for column view right click context menu in the Content Browser
-
Added "Find References" to UMG animation right-click menu.
-
Property Editor: Add getting the expansion state for a detail property row.
-
Added a scrollbar to the localization dashboard when there are many localization targets.
-
Property Editor: Remove 0-360 restriction on rotation dragging so that you can drag to negative rotations and beyond 360. The delta is set to 1 (ie. slider rotates by 1 degrees)
- Exposed RequestForceRefresh for detail customizations to use
- Using RequestForceRefresh is preferable when the refresh can be deferred, as it can prevent performance problems from refreshing the view multiple times within a single frame
-
Added single struct property support to the PropertyEditor, through the use of the StructureDataProvider interface.
-
Added support in the category builder for external structure properties, though the use of the StructureDataProvider interface
-
The main menu sub-menus, sections, and entries created by registering tab spawners into the menus can now be given explicit FNames. This allows other code to extend the same menu structure using the ToolMenus system.
-
Improve platform stats and material editor compilation warnings
-
Add a low-level unit test project for the ToolMenus menu system.
- Added a way to manually grant EditConditionHides behavior to Detail Property Rows that have custom Edit Conditions defined outside of property metadata (e.g. FDetailPropertyRow::EditCondition).
Bug Fix:
-
Mac: Fix NSCursor hotSpot logic. Need to use the actual size for the user coordinates instead of the image dimensions. Additionally, the hotspot: expects values from 0,0 -> w-1,h1. When a blueprint node specifies a value where (hotSpot.x/y * Image.pixelW/H) > Image.size.W/H, where hotSpot.x/y is 0...1.0, then no cursor would be displayed.
- Minor revision to SGraphPanel to decouple its refresh on updates to the underlying graph object from a dependency on a parent SGraphEditor.
- This allows SGraphPanel widgets that live outside of an editor context (e.g. previews) to avoid node/pin references going stale if the underlying graph object is reconstructed.
-
CommonUI: Action Domains: Fixed an edge case where action wasn't found if we had multiple action domains.
-
Editor: Fixed Allow Cinematic Control so that it restores properly when you reopen the editor.
-
Improve Class Viewer offset and padding so that it doesn't overlap with other elements
-
Fixed failure to propagate property value changes for floating point values (including structures of floating point values like rotators and transforms)
-
Scene Outliner: Fix crash in folder context menu generation.
-
Color Customization: Fixed transaction not ending when closing the inline color picker.
-
Don't show Level Instance properties on the World Settings
-
Fix image size getting set to random values when applying new materials #okforgitub public
-
Fix a crash that could happen when object references were collected while the menu system was generating a widget using a legacy code path.
-
Fixed comment bubble text input background scaling incorrectly with multiple lines of text.
- SSubobjectEditor::GetSelectedItemsForContextMenu provides the correct component for inherited SCS components
UX
New:
-
Added binding to create a new Custom Event Node. No binding by default. Similar to pressing C to create a new Comment Node.
-
The level viewport camera info will now get saved when closing the editor. They will be reapplied when the editor is relaunched and the same level is reloaded.
-
Use Microsoft Windows style grey and red hover colors for the minimize, maximize, and close buttons of the editor title bar.
-
ShowOnlyInnerProperties now works on nested structs to show the properties on the innermost struct marked with the specifier.
-
PR #10826: Add delegate in UAssetEditorSubsystem to broadcast when an asset editor is closing #contrib 10826
-
Warn if derived material instances fail to compile in Material Editor
-
Add a viewport action to focus the selected actors in the outliner (to be used with AlwaysFrameSelection off)
-
Add support for searching the collection filter in the Reference Viewer.
-
Change the background color of the editor project badge to match the rest of the title bar.
-
Add a plugin filter to the Reference Viewer. Only plugins that contain assets visible in the unfiltered graph are shown in the list.
-
Outliner: Keep folders selected when changing / clearing search text
-
Reduce vertical space consumed by the title bar and tab areas of editor windows. This includes reducing the height of the minimize, maximize, and close buttons to further pack the interface.
-
In the Level Editor, the Focus Selected command has been moved to the Actor context menu and renamed to Frame Selected. In addition, the View Options menu items now appear in the Actor menu in the main menu bar as well as in the contextual menu.
-
Add bindable viewport camera rotation UI commands
-
Add "Browse to Asset" context action to the global asset picker
-
Pasting / Duplicating an actor now moves the new one to the "Current Folder" (if it's set)
-
Report issues in base material for shader platforms not covered by current RHI feature levels.
-
Added new keybind that combines Close Minor Tab and Close New Tab. Unbound by default, this keybind will let users press a single key to close the focused tab regardless of its type, prioritizing minor tabs.
-
Make keyboard shortcuts searchable in Editor Settings with the format: KeyBinding="F"
-
Make it possible to move the UE window by dragging with the mouse on the title bar project badge.
-
Property customizations: Added a CreatePropertyValueWidgetWithCustomization API that accounts for customization and thus supports struct properties.
-
UToolMenus: Add API to support Menu Profiles, a menu profile is a lightweight version of a menu customization - but you can have multiple menu profiles and activate/deactivate them at runtime per menu instance using a new menu context.
-
EditorUtilityBlueprintFactory: Modify the class picker to use a TreeView to show classes in hierarchy
-
Most menus in the editor are searchable by typing into them. To make this more obvious, we now show the menu search field by default in menus with 10 or more items. You can change this threshold using a new setting under "General - Appearance - User Interface".
Bug Fix:
-
PR #11216: Fix Overlapping section name in FMainMRUFavoritesList by allowing an override for the favorites section ini. This fixes a bug where favorite levels were not persisting #contrib 11216
-
Fixed an issue where the modal progress bar (FFeedbackContext) wouldn't get displayed to the user.
-
Updated FNavigationConfig with an option to only send key events if no modifiers are held Updated the EditorNavigationConfig to use this new setting, preventing an issue where the Ctrl+Space content drawer hotkey would be consumed by some widgets
-
Fixing a bug where the checkout error dialog box won't show even though there are packages which failed to checkout.
-
Property Matrix: Fix a bug that stopped search from working in the "Pinned Columns" tab
-
Fix crash pressing 'w' or 'e' in material editor to due hidden viewport movement triggering a draw of hidden viewports
-
Tweaked the content drawer behavior so that it gets properly summoned when browsing to an asset from a pinned tab.
-
You can now paste into the Mobility field of the details panel.
-
Property Matrix: Fix a crash when you tried to edit a property on a light component
-
Fix a crash on hovering over the "transform" submenu in the light mixer context menu
-
AssetEditorToolkit: Fix a crash when trying to force delete an open DataFlow asset
-
Fix Rotator not shown in degrees by default Math Struct customization
-
Outliner: Fix a crash in the "level" column name selection code when you tried to exit PIE.
Foundation
New:
- Added Experimental Studio Telemetry plugin.
-
This is fetaure captures telemetry for common Editor workflows and can be extended by the end user to support their own anlaytics backends via an IAnalyticsProvider implmentation exposed from an IAnalyticsProviderModule implmentation. Studio Telemetry is enabled by default and comes with 2 sample Analytics Providers - A Horde Analytics implmentation and a JSON Log file implementation.
-
Added support for the TOptional
type to UHT. -
DDC Http Store - Added ability to configure AuthScheme (defaulting to JWTBearer as before) and the ability to directly specify a auth token. This can be used to run with the ServiceAccount scheme in Cloud DDC which we intend to use for getting onboarded quicker by licensees (it is not a recommended approch to use for wider deployments across teams).
-
Made memory usage print outs in out-of-memory situations use a common unit (GiB)
-
Add support for plain text to FAutomationTestBase::AddExpectedMessage
-
Added missing LLM Tag for AssetRegistry loading
-
Support load and save of platform specific test exclusion list from the Test Automation window
-
Added GetTypeHash to FDynamicallyTypedValue for when used as a key for TMaps.
-
Added FDataRegistryResolverScope::ResolveNameFromId interface that allows specifying temporary local objects instead of having to allocate a shared pointer for every single one. Deprecated the ResolveIdToName overload that returns the resolver as TSharedPtr.
- Made it so that LLM counters are updated more regularly during cooking (on package load and save)
Bug Fix:
-
Fixed that some FName allocations were not using the FName LLM tag
-
OidcToken - Allow multiple instances of oidc token to read the windows token store at the same time, and prevent updating the token store file if there are no changes applied to it. Reduced the scope the mutex to only cover the updating of the token store.
-
OidcToken Create output directory for temp file if its missing Corrected logic for tokens that do not expire (they are set to expire at 0 which we didn't treat correctly) * Make sure to save the new refresh token we get after using a old one, resolves issues for horde.exe that had to prompt users for logins more often then it should need to.
-
Prevent the server from sending the server-only-option of ?listen when doing a Client Travel. This will prevent the client from incorrectly thinking it's a listen server during travel.
-
OidcToken - Removed special case handling of chrome and edge as this causes issue when spawned from Visual Studio
-
OidcToken - Allow you to only specify the list of redirect uris instead of both that and the single redirect uri
-
Moved FUntilDoneLatentCommand Predicate call to be able to: - Done() correctly - Be able to call Predicate multiple times on FUntilDoneLatentCommand::Update().
-
Fixed crash in SQLite when the current malloc doesn't support FMemory::GetAllocSize.
-
OidcToken - Allow for allocating of an access token without a identity token, we never actually used the IdentityToken and allowing to get a access token without it allows us to sidestep issues with some IdPs only providing thin tokens when you request both identity and access tokens at the same time.
-
OidcToken - Added timeout option (defaults to 20 minutes) were if the user hasn't logged in the opened browser for this time we just shutdown with a error, this prevents zombie processes from sticking around at the risk of users coming back after this timeout and trying to login to the popuped browser and getting a 404 (as the local webserver will have shutdown).
Build
New:
-
UGS: We no longer download a precompiled binary if we have just downloaded that exact binary.
-
Adding SplitFirst and SplitLast StringOps to BuildGraph, which return the first and last element (respectively) of the split input string.
-
Modified UBT to generate more detailed information when the compiler crashes.
-
Added KeepFileOpenLog option to build targets so that you can optionally skip -fileopenlog during cooks to save memory
-
Support live coding when the BaseDir is != than the Executable path
-
Added a warning if a project module is found to have a dependency on a plugin module without listing that plugin as a dependency. The plugin has to be enabled by default or enabled in the .uproject or enabled in the target.cs
-
Support for game projects overriding how to copy files during staging. A CustomStageCopyHandler can be implemented to supply the copy operation
-
TargetRules can filter referenced plugins to determine if it should be ignored from the build.
-
Added support for -fextend-lifetimes compilation switch on selected Clang-based platforms which improves debugging experience of optimized builds by increasing the number of local variables for which the debugger can show values. The feature may slightly reduce performance and is intended to be used in development only. It has to be explicitly activated by setting bOptimizeForDebugging variable in
Platform section of BuildConfiguration.xml. It won't affect Test or Shipping configurations. -
UGS: Change the default UGS build config from DebugGame to Development. Only affects new UGS installs.
-
Extending ICustomStageCopyHandler to support overriding of the plugin manifest file creation. Allows game projects to have control over how plugin descriptors are added to the manifest
-
Intel® Implicit SPMD Program Compiler (ISPC) has been updated to version 1.21.0.
-
UGS: Improve the performance of the "Finding last code change..." step in the sync.
-
Add "-FORCEUPDATEALL" option to update .vcxproj.user files during project generation
-
Fixed -SkipEncryption not skipping encryption of PAK files
Bug Fix:
-
Fixed source indexing on Windows-based platforms generating incorrect paths for workspaces using the 'import' functionality on Perforce.
-
Fixed issue where UBT would fail with a concurrency error when doing log once logging.
-
UBT: Fix for MakeStubItems with Circular Deps.
-
Fix a problem with path determination during chunked DLC builds
-
Outputting the plugin filename with Json parse exceptions
-
Fix UBT to enable hot reload modules for engine only builds. This is done so that live coding checks still work when building from P4V or other tools that might not specify a project file.
-
Objects referenced only by soft path literals will be correclty included in packaged games when using CookSettings.SkipOnlyEditorOnly
Deprecated:
- Prevent future inclusion of MinWindows.h, PreWindowsApi.h and PostWindowsApi.h via header guard warning. - use WindowsHWrapper.h, AllowWindowsPlatformTypes.h and HideWindowsPlatformTypes.h instead.
Compile Time Improvements
New:
-
UBA: Handle the scenario where files may be spread across mounts and linking won't work. When this happens fall back to copying/sendfile-ing files around.
-
UBA: Fix bus error on Intel Macs due to a stacksize limit
-
UBA: Add support for CPU time for MacOS using mach messages.
-
UBA: Fix for UbaAgents waiting for host now that poll is used.
Bug Fix:
-
UBA: Fixes various small bugs.
-
UBA: Fix up tests on Mac. * Need to grab the actual clang binary location and the SDK path.
-
UBA: Close fds when done with polling to stop leaking on MacOS.
-
UBA: Fix for populateCasFromXcode.
-
UBA: Bump cmdline limit to 64k
-
UBA: Add if some defs around POLLUP for platform differences
-
UBA: Additional changes for Mac support. Fixes an issue with socket closing Adds support for getting number of procs.
-
UBA: Remove Touch test from Mac running.
-
UBA: Address issue of agents quitting instead of waiting to connect to host.
-
UBA: Various fixes for POSIX APIs. Checking returns a bit better Handling "/" in a friendly way since realpath calls stat with "/" Hooks up lockFd so we don't accidently close fd1 and fd2 (aka stdout/stderr) MacOS doesn't have subreaper so implement another way using sysctl
-
UBA: Clean up thread attrs after creating the thread.
Core
API Change:
-
Enable it via GlobalDefinitions.Add("UE_STORE_OBJECT_LIST_INTERNAL_INDEX=1") in your Target.cs. This functionality requires enabling 4 bytes wide FName (can be enabled by setting bFNameOutlineNumber to true in Target.cs) as it takes advantage of the padding in the UObjectBase memory layout.
-
UObject::CollectDefaultSubobjects was deprecated for being redundant and incorrect and the comments were updated on IsDefaultSubobject to document the confusing behavior. Most of the time it is better to use a different function like IsTemplate or the new IsTemplateForSubobjects
- Depending on a compiler this change may introduce compilation errors when passing TObjectPtr variables to UE_LOG macros in which case the raw UObject pointer needs to be extracted with TObjectPtr::Get() function:
- TObjectPtr
ObjPtr; UE_LOG(LogTemp, Log, TEXT("UObject pointer: 0x%x"), ObjPtr.Get()); - Some C++ compilers may also fail to compile foreach loop statements when iterating over an array of TObjectPtrs where the elemental variable declaration is a const value type of TObjectPtr (const TObjectPtr
Value). In this case the elemental variable declaration needs to be converted to a reference type: - TArray
> ArrayOfObjectPtrs; for (const TObjectPtr & Value: ArrayOfObjectPtrs)
- TObjectPtr
- This information is always available at runtime via the BuildSettings module regardless of being embedded in the binaries.
New:
-
Sponsor mode in UnrealTraceServer Adds new "sponsored" mode of running the server, in addition to regular "persistent" mode. In this mode the server must be started with a parent pid. Additional pids can be added. When all sponsor processes have exited and there are no active connections the server will exit. Controlling which mode the server runs in can be done in Unreal Insights or via the Trace Widget in Unreal Editor. Command line options and command parsing has also been refactored and is now parsed and passed to all main functions. Command line help is also added.
-
Update VTune library to latest 2023 release.
-
Replaced versioning implementation in FInstancedStruct to use archive custom versioning. Also make serialization symmetrical so struct serialized in cooked builds can be deserialized in Editor builds.
-
Added new static StringType::Construct* functions to replace the dubious set of string constructors whose behavior aren't obvious - the old form of constructor are not yet deprecated for FString but are for FUtf8String and FAnsiString.
-
Added TIsTArrayView_V
as a more efficient alternative to TIsTArrayView ::Value. -
Fix EUnitType::DataSize quantization factor to 1024 instead of 1000. The data size units are treated as KiB, MiB, GiB etc
-
Added another operator+ for FAsciiSet to allow for combining sets
-
Added a family of string splitting functions as UE::String::Split(First|Last)[OfAny][Char].
- Add additional macros for getting enum/member/function names as string views. Required for using in a compile time context.
-
Add missing macro for getting enum name as a string, to match the existing macros for member and function names.
-
Made LexToString more generic by providing a string type as an optional template parameter.
-
UnrealBuildTool: Setting to control print level of PVS-Studio analyzer warnings (-StaticAnalyzerPVSPrintLevel)
-
Update TFuture/TSharedFuture to work with non-copyable types.
-
The debug name provided for the DDC requests has been modified to append a "[Fast]" and/or "[Meta]" tag to make DDC logs clearer as to what key is being requested and hit/missed.
-
Improve DataTable errors to help diagnostic between mising struct and not yet deserialized error
-
Added FunctionFwd.h for the forward declarations of types defined in Function.h.
-
Added functions to CompositeDataTable for adding and removing individual Parent Tables as well as removing an array of Parent Tables.
-
Extended TArray bulk serialization to all arithmetic types.
-
PR #11054: [PVS-Studio] Add new PVS-Studio.exe silent exit code mode. #contrib 11054
-
Added floating point unit tests for FMath::Wrap. Added a new FMath::Modulo which generically encapsulates integral/float differences.
-
Moved TUseBitwiseSwap into its own header.
-
AsyncCompilationHelper - Remove 16ms main thread sleep that happens per incomplete task and instead favours polling all tasks and sleeping once if not all tasks are complete. ICompilable WaitCompletionWithTimeout () method is now documented to poll if given a 0 TimeLimitSeconds. To adjust for this, implementers of ICompilable will now poll if TimeLimitSeconds is 0 before waiting. There are a few implementers that don't use an event and sleep which is not ideal, but we at least now poll again after sleeping to avoid another round trip to know if the task is complete. FAsyncTaskBase::WaitCompletionWithTimeout now polls for completion when given a time limit of 0 seconds. This simplifies use, and avoids unintended yielding. Before PIE.Startup FAsyncTask::SyncCompletion Total Inclusive Time 5.25s (40606 calls) After PIE.Startup FAsyncTask::SyncCompletion Total Inclusive Time 195ms (39504 calls)
-
checkf and ensureMsgf will now validate the printf parameters when UE_VALIDATE_FORMAT_STRINGS is defined. FormatStringSan::bIsIntegralEnum now properly detects TEnumAsByte as enum types.
-
Added FAnsiString and FUtf8String.
-
Replaced loop with modulo in FMath::Wrap to make it run in constant time. Added some tests that would have failed with the previous implementation due to lack of floating point precision. Added some constexpr tests, though only the integer tests can be supported before C++23.
-
Added TRefCountingMixin to provide AutoRTFM aware ref-counting for use with TRefCountPtr
-
UnrealBuildTool: Option to disable anaylzing engine modules or generated code
-
PR #10774: Add target rule for ALLOW_CONSOLE_IN_SHIPPING define #contrib 10774
-
Add config file options so that the virtualization system is able to retry pulling failed payloads when running in unattended mode (defaults to off)
-
Support emitting line tables only for debugging rather than disabling debug info entirely Configuration is the same as TargetRules.DebugInfo and will override that setting except when debug info is disabled for the entire target
-
Eliminated most blocking during requests in the Cloud DDC
-
Increase the maximum possible size of TInlineValue
-
Read the environment variable UE_LOG_JSON_TO_STDOUT to enable structured logging on stdout for consistency with other tools
-
Adding an LLM console command to associate allocations with their underlying page allocation in Unix to classify them as shared/private/unreferenced. This also fixes the old smaps parser to not incorrectly bail before EOF if fewer bytes were provided than asked for as that's an allowable condition.
-
Added CHARTEXT(CharType, x) which expands out to x, TEXT(x) or UTF8TEXT(x) depending on CharType.
-
Intel ICX 2024.0 integration plus instrumented/sampled PGO support (via Jeff.Rous)
-
Added PREPROCESSOR_VA_ARG_COUNT(...) and PREPROCESSOR_APPEND_VA_ARG_COUNT(Prefix, ...) macros, which evaluate to the number of arguments passed to it and a token made by appending a prefix to the count respectively.
-
Avoid unecessary copies of FStreamableDelegate within FStreamableManager. + Added an overload of FStreamableHandle::ExecuteDelegate that takes the FStreamableDelegates by rvalue. This code path will continue to pass the delegates along by rvalue to avoid copies. + Fixed up multiple call sites where copies were being done and replaced with moves.
- Improved plugin manager exclusion support when using -EnableAllPlugins
- Added -ExceptRestrictedPlugins to allow you to exclude any restricted plugins
- Added wildcard support to -ExceptPlugins (and -EnablePlugins and -DisablePlugins) so you can do something like -ExceptPlugins="Online*"
-
Cache the 'NotExcluded' state alongside 'Excluded' and 'Included' to prevent excessive query ConditionallyExcludeObjectForRealm on deeply nested object graph with a lot of public leaves
-
BuildSettingsVersion.V4 enable msvc strict conformance mode by default
-
JsonObject, JsonWriter and JsonSerializerMacros updated to use FStringViews and FString to avoid unnecessary allocations.
-
Add IsValidIndex function to TPagedArray for parity with other containers.
-
Added the ability to delay reachability analysis interations by the specified number of frames (with gc.DelayReachabilityIterations console variable) to stress test garbage collector write barrier in TObjectPtr.
-
TArray::Append now consistently uses a 'grow' instead of 'reserve' memory growth strategy, so it has amortized linear cost to call many Append()s in a loop for all versions of the function. (Previously it inconsistently used either strategy depending on how it was called.)
-
Added FPackageName::GetVersePath as a shared util for UObjectBaseUtility and FAssetData
-
Add FindFrom function to TBitArray, to allow a user to provide a start index when searching for a value.
- Added a scoped override for FMessageLog behavior
- FMessageLogScopedOverride can override the log behavior of a given named FMessageLog for the duration of the overrides lifetime, optionally suppressing output log mirroring, or promoting/demoting log categories (eg, to make errors act as warnings, or warnings act as errors).
-
Add a control widget in Unreal Insights and Trace widget in Unreal Editor to control the local UnrealTraceServer instance.
-
UScriptStruct::ImportText is now const-correct
-
Added verification tests to make sure there's no unreachable objects still being referenced by reachable objects after garbage collector's reachability analysis has completed (enabled with gc.VerifyNoUnreachable console variable)
-
Added StrCast as a long-term replacement for StringCast, because of the latter's behavior with regards to mid-string zeros, and used it to fix FString serialization when it contains a trailing zero.
-
Add floating point append operators to FStringBuilderBase. Uses the same format specifiers as LexToString does (via TFormatSpecifier in UnrealTypeTraits.h)
-
Add an overload to the FindRef method of TMap and TSortedMap that take a fallback default value
-
Improve LinkerLoad instancing context population to catch object in external package outered to object in instanced packages
-
Add overload of TryConvertFilenameToLongPackageName using FStringView and FStringBuilderBase
-
StaticDuplicateObject now uses unversioned property serialization, improving the performance of object duplication
-
Reduced book keeping memory in FMallocBinned3
-
Serialize complete property type names with tagged property serialization to support more robust asset loading when the type schema changes.
-
UObject::GetAssetRegistryTags changed its function prototype to take a Context object that reports whether the call is coming from SavePackage (and should calculate everything) or load (and should skip expensive tags). This new Context object allows Engine classes and Licensee classes to report different tags for the three scenarios of editorsaves, cooksaves, and dynamic on-load updates.
-
Added support for up to 128 bytes alignment in the FMallocBinned2 for small bins allocations. Previously allocations with alignment higher than 16 would be treated as OS allocations and would be multiple of a memory page size (4KB)
-
Added FThreadManager::ForEachThreadStackBackTrace for retrieving callstacks without incurring additional allocations (which will be used to avoid failing to allocate memory while crashing out of memory).
-
LLM: Added "-Assets" and "-AssetClasses" params for the "DumpLLM" console command. This will dump the respective tag sets (instead of default tag set). Requires LLM_ALLOW_ASSETS_TAGS and game/editor to be started with "-llm -llmtagsets=Assets,AssetClasses" in command line.
-
Make AssetFails, AssetWarning and AssetPasses functions use const object parameters
-
Added an option to replace a hash map in the ClassToObjectListMap (a part of UObjectHash) with an array. This will improve lookups and reduce memory footprint.
-
Add CVar, core.EnsureAlwaysEnabled, to allow disabling of ensureAlways and treat them as regular ensure instead
-
Load additional BuildConfiguration.xml files from
ProgramData&LocalAppData -
Add TBitArray range-based for loop support
-
Added multi-process support to the saving of Derived Data Cache (DDC) replays
-
Adds missing GetId() member from TSet::TBaseKeyIterator. Without this implementation, it's not possible to use GetId() on TMap::TKeyIterators/TConstKeyIterators This missing implementation is specifically helpful for cases where you'd like to find the KV Pair ElementType for a given KeyArgumentType in cases where you may have collisions between keys and the actual KeyArgumentType value is important. Example case is when dealing with FNames in Editor since they compare on case-insensitive CompareIds but have unique DisplayIds for different casing. If you want to know the casing used when inserted into a map, you can now do the following:
TMap<FName, FAssetPackageData*>::TConstKeyIterator It = CachedPackageData.CreateConstKeyIterator(PackageFNameOfAnyCase); FSetElementId Id = It.GetId(); if (!Id.IsValidId()) { return nullptr; } const TPair<FName, FAssetPackageData*> KVPair = CachedPackageData.Get(Id); FName PackageNameWithCasingUsedUponInsertion = KVPair.Key; return KVPair.Value; -
Removed some unused includes in coreminimal.h and color.h from stat.h.
-
Make Linux/Mac use editor version of crash reporter when compiled with WITH_EDITOR.
-
Added support for multi-line entries on config set properties. Existing config values for set properties should continue to be loaded the same way as before. Example syntax: SetProperty=("Value1", "Value2") +SetProperty="Value3" +SetProperty=("Value4", "Value5")
-
Oodle Data, Network and Texture updated to 2.9.12
-
Add GetFNameSafe functions for UObject and FField. These complement the existing GetNameSafe functions.
-
Update FInterpCurve
::FindNearestOnSegment to avoid allocating TFunctions. -
Added a constructor to FMutex to acquire the lock upon construction
-
Set UE_VALIDATE_INTERNAL_API to control the define UE_INTERNAL which will be set to an empty macro for Engine modules and [[deprecated]] for non-engine modules
-
Allowed casting functions like MoveTemp and Forward to be elided and replaced with direct casts.
-
Add support for /PDBSTRIPPED msvc symbols with -StripPrivateSymbols
-
Add new IsTemplateForSubobjects function that correctly handles querying for all types of subobject templates and improve related comments
-
Cooker: SkipOnlyEditorOnly. This flag is now on by default, and not using it will eventually be deprecated. Packages that are loaded during the cook for editoronly reasons are no longer automatically added to the cook output; they will only be added to the cook if referenced from a cooked package, or via a few other possible methods. *If SkipOnlyEditorOnly causes a problem, and it is not obvious how to fix it, turn it back off again by editing DefaultEditor.ini:[CookSettings]:bSkipOnlyEditorOnly=false, and please send a UDN asking for help in fixing the issue.
-
Assigning a value or copy-constructing TObjectPtr will now run garbage collector write barrier when incremental reachability analysis (garbage collection) is in progress. This means TObjectPtr is no longer trivially constructible and assignable.
-
Scheduler improvements and bug fixes
-
FHarvestedRealm::NameExists changed to consume const FName& rather than FNameEntryId as it leaked the internal storage details for export names of the realm into the API. Since we only store display names in the realm, we can directly compare FNames using display names when verifying we saved correctly. 114ms -> 3ms for SaveContext_NameExists over 71,680 calls
-
Memory-optimized custom IOStore hash map - 65.7 -> 25.9MB for internal project on Gen5 console
-
Replaced many UE traits with standard traits and metaprogramming constructs with simpler and faster-to-compile constructs.
-
Add support to set NTDDI_VERSION with WindowsPlatform.TargetWindowsMinorVersion
-
Added nodiscard to the constructors of TGuardValue, TOptionalGuardValue, TGuardValue_Bitfield_Cleanup and TScopeCounter.
-
PR #11383: Project Generator for Visual Studio Workspace support #contrib 11383
-
Added fallback to standard stack walking for memory tracing for Windows. In some cases our unwinding tables approach didn't work (e.g. when compiled with clang). In those cases fall back to the standard stack walking methods.
-
Add msvc 14.39.x to preferred msvc toolchains
-
UnrealPak: Replace check with warning for missing import Script Object in IoStore describe
-
Version 1.20 of UnrealTraceServer for Windows, Linux and macOS.
-
Added support for incremental Gather Unreachable Objects (post reachability analysis phase of garbage collection). It's now possible to split this phase into multiple frames to avoid hitches on slow or single-threaded platforms.
-
Significantly improved performance of marking objects as unreachable (initial phase of garbage collection) when running in single-threaded environments.
-
Add support for universal binaries for UnrealTraceServer.
-
Added experimental support for incremental reachability analysis (a phase of garbage collection that determines which objects are to be destroyed). It's now possible to split reachability analysis into multiple frames with the specified per-frame soft time limit.
-
Exposed metadata more extensively in the Derived Data Build API
-
Bump preferred MSVC compiler to 14.38.33130 - VS2022 17.8
-
Allow applications to limit the total number of worker threads used by TaskGraph at compile time using UE_TASKGRAPH_THREAD_LIMIT.
- UPackage->Guid deprecated and replaced by UPackage->GetSavedHash.
- FPackageSummary::Guid deprecated and replaced by FPackageSummary::GetSavedHash. FAssetPackageData::PackageGuid deprecated and replaced by GetPackageSavedHash. UPackage->Guid has been marked deprecated for a while; we will remove it in 5.5. The new SavedHash API is only available in the editor; in the cooked game we are removing UPackage->Guid with no replacement because it is unnecessary and costs memory. GetSavedHash currently just returns the old deprecated Guid, but in 5.5 it will change to instead return a hash of the package's bytes that were saved to disk.
-
The content browser tool tip property "Has Virtualized Data" is now only displayed if a project has enabled virtualized assets.
-
PR #11565: Added a new format of the analyzer report #contrib 11565
-
Add a few commands to the command console autocomplete list:
obj gc,obj dump,debug crash,debug rendercrashand extendedobj refs -
Moved some FString default arguments out of some headers to allow them to be compiled with only a forward-declaration of FString.
-
Removed NetworkVersion.h from Vector2D.h.
- Save and ResetLoaders only flush loading requests specific to the package when there's already pending async requests
Bug Fix:
-
PR #10682: When linking msvc platforms with clang pass -gcodeview-ghash with -Xclang #contrib 10682
-
Ensured that the primary TIsContiguousContainer trait isn't instantiated with an incomplete type and so memoized into a bad state. Added a specialization for unbounded array types, which are not regarded as contiguous containers because they don't have an determinable end.
-
PR #11411: Fixes for Rider project file generator #contrib 11411
-
Made UE_DEPRECATED_MACRO emit errors in MSVC when bWarningsAsErrors=true.
-
Fix warning "Failed to find object 'Object None.None'" when deserializing FObjectAndNameAsStringProxyArchive. This should also speed up loading a buffer with a lot of NULL objects considerably
-
PR #11261: Fixed missing toolchain include paths on Linux #contrib 11261
-
PR #10515: Add architecture info to Rider project files #contrib 10515
-
PR #11163: Expose additional project properties from UBT to Rider #contrib 11163
-
Move clearing of dirty flag and file size update out of InnerSave This allows delegate broadcast for dirty state update to happen out "IsSavingPackage" scope
-
Support UE versionning in FMovieSceneEventParameters
-
Add setting to control disabling some debug info optimizations when compiling msvc platforms with clang that can in some cases cause missing debug information
-
Added checks to ensure that users cannot emplace intrusive unset values into TOptionals.
-
PR #10511: Fix rsca for toolbox 2 0 #contrib 10511
-
Fix trace in "no logging" configurations
-
PR #10594: Add list of subrules files to generated Rider project files. #contrib 10594
-
PR #11227: Fixed missing system include paths on macOS #contrib 11227
-
Improve comments related to Interfaces to match the actual behavior for blueprint-implemented interfaces. The public documentation for Interfaces has also been improved to explain that blueprint-implemented interfaces do not actually exist in the C++ representation of an object
-
Ensure UnrealBuildTool.dll exists when cleaning projects in installed builds
-
Invalidate makefile if a header only directory is added or removed
-
Fixed TreatWarningsAsErrors not affecting the verbosity of the underlying log, and added TreatErrorsAsWarnings
-
Properties that aren't going to be serialized are no longer considered when determining whether Sparse Class Data should be written out
-
Fix socket keep alive in UnrealTraceServer for Mac/Linux.
-
Cooker: Improve error message: Change "was never saved as an export" message into clearer text "content is missing from cook", and add feedback for why it is missing from the cook.
-
Allow _DEPRECATED properties in sparse class data to not be marked as VisibleDefaultsOnly or EditDefaultsOnly
-
Fixed the root node's children not being properly unset during TOctree2::ApplyOffset.
-
PR #10946: [Rider] Fix IntelliSense by adding include order deprecation defines #contrib 10946
-
BootstrapPackagedGame: Allow skipping the prereq installer if the required dependencies are bundled with the application
-
Enable tracing of "CustomTag" when FName based tags are disabled.
-
Fixed assert firing in the destructor of FArchiveFromStructuredArchiveImpl caused by FMulticastSparseDelegateProperty::SerializeItem() not closing an archive adapter.
-
Fix issue with C# JsonWriter to support characters the should be escaped in a value name.
-
Fixed move semantics in TFrameValue.
-
PR #10731: UnrealBuildTool: fix GenerateClangDatabase #contrib 10731
-
PR #11345: Fix for rebuilding whole Unreal Engine sources in Rider #contrib 11345
- Filter unmounted packages when querying a cooked asset registry in the editor
- This provides a consistent experience between the cooked and uncooked asset registry
-
Fixing a crash when an empty string is passed to CompareWithNumericSuffix
-
Cooker: AdditionalPluginDirectories: Fix staging to look in the RemappedPlugins directory when cooking DLC plugins that are in AdditionalPluginDirectories. Fix cooker to store all metadata in the RemappedPlugins. Fix cooker for even normal DLCs to store all metadata in the DLC's directory rather than the project's directory.
-
Make sure objects preloaded during the async deferred post load step of the legacy loader adds them to the list of objects it tracked
-
Fixed some TArrays of C arrays, which was never supported and only partially worked.
-
Added a fatal error if the DDC is not readable or writable
-
Ensure FileInlineGenCPPMap is set for the module compile environment
-
Updated NoExportTypes.h to add missing entries to EUnit, and to correct the order of units that were already there. This fixes some serialization issues.
-
Exit the game in PreInit on Windows when an unsupported CPU is found rather than wait for an unsupported instruction exception.
-
Fixed creation of DDC stats when using a throttle node
-
CborStructSerialalizerBackend fixes for FSoftClassProperty. Serialize it like FSoftObjectProperty, where the path can be valid even if the object reference isn't.
-
ConcurrentLinearAllocator: Allow not FastPath platforms to allocate blocks with supported alignment. Currently Malloc will fail on such platforms, because not all platforms support 64kb alignment.
-
Correctly add project source dir to include path when building a generic target (UnrealEditor, UnrealGame) with a -Project
-
Fix not selecting the preferred WindowsSDK if it is available when a supported version min or max is also requested
-
Remove some redundant check()s from TArrayView constructors, in particular when copying from other TArrayViews.
-
Fix TMatrix2x2 rotation constructor. Use TQuat2 instead of FQuat2D.
-
Fix to ArchiveCrc32 operator<<(FArchive&) template generalization for structs to only apply for direct serialization to ArchiveCrc32 and if there is no better conversion available.
-
Fixed AsArray and AsObject in CompactBinary to store type errors
-
Fixed TBitsToSizeType's static assert, which would only fire if passed zero.
-
Fixed TScriptInterface's implicit conversions.
-
Fixed reporting of container property names when logging references to objects.
-
Fix a bug where loading a bulkdata payload from a cooked package mounted in the IoStore could end up loading more data off disk than required.
-
Replaced explicit memmoves with RelocateConstructItems inside TArray. Optimized some repeated rereads of unchanged data mid-loop.
-
Workaround for a VC bug: When inlining, VC works to avoid the load->store forwarding stall but loses track of things and inadvertently ends up requiring alignment on temps it creates causing semi random crashes depending on whether the allocator/stack decided to align them. The fix is to switch to directly setting the values.
-
Fixed TSparseArray::operator() indexing usage in its TConstSubsetIterator.
-
Made the JsonArchive structured formatters non-copyable so that their useless copy and move consturctors don't show up in IntelliSense.
-
PR #10620: Make sure BuildU[A|B]T.bat explicitly call the Windows find.exe utility #contrib 10620
-
Fixed an issue where the engine might query the asset registry before the premade asset registry had finished loading.
-
Fix for FString::ParseIntoArray when string to parse has a length of 0, but still has backing memory
-
Fixed FLinkerInstancedPackageMap::BuildPackageMapping to be case insensitive - Added optional SearchCase parameter to TStringView<>::Contains and TStringView<>::Find defaulted to ESearchCase::CaseSensitive for backward compatibility
-
FStructUtils::AreSameLayout now returns true for nullptr, nullptr - importantly this fixes comparison of class layouts when the class does not have any sparse class data
-
Support Intel compiler 2024.1
-
Fixed default initialization of TLS slots to 0 across the engine. 0 is a valid TLS slot and some slots could have been tested against 0 to detect their validity leading to a TLS slot leak at best
-
Fixed some unreachable code errors.
-
Fixing single entry set properties not being saved correctly in some cases. Making UObject::SaveConfig fall back to the default non-specialized behavior if a set property has one or fewer elements to match the load behavior
-
Enables SymsLib resolver in TraceAnalysis for Mac and Linux.
-
PR #11563: UnrealVS: Prefix encrypted Perforce server port address with "ssl:" #contrib 11563
-
Added FArchiveFromStructuredArchiveImpl::operator<< overload for FObjectPtr which fixes a crash when serializing TSubclassOf.
-
Fixed TStaticBitArray::operator== const incorrectness and implicit conversions, which caused operator!= not to used but to construct a temporary and compare that instead. Added TStaticBitArray::HasAnyBitsSet().
-
MpscQueue - Fix for dequeuing move only types.
-
Fix double redirector not properly resolving themselves in some loading order edge case
-
Fix compile single file for external projects & show additional target.cs files
-
Fix UnrealTraceServer timestamps on Linux.
-
EX_Let handles attempted assignments to null objects when the property has a setter
-
Fixed uninitialized variable in FInterpCurve
::FindNearestOnSegment() when BreakBeforeEvaluate() returns true on the first iteration. -
Account for complete trace event fitting in the buffer for scoped events. Previously Header and event body could end up in different buffers, causing incorrect data.
-
Fix compile error caused by an uninitialised const "Unit" member in FNumericUnit when initialising from another unit type.
-
MB2 Allocator optimizations. - Removed extra page allocation for VMA pool header. - Added VMA pool stats reporting. - Removed extra lock per pool (was not used). - Scale factor parameter is configurable via compile-time definition.
-
Removed FAnsiStringView overload for HexToBytes, because it's already handled by the UTF-8 overload and causes ambiguous overload resolution.
-
Fix HTML formatting for FPSChart
-
Fixed a potential race condition in the object annotation system
-
Allow traced log messages to be longer than 1500 characters.
-
Fixed a crash when a boot cache is present in the DDC configuration
-
Prevent unnecessary rebuilds of windows resource files for development builds to reduce how often binaries relink Only embed info from Build.version in exes and dlls for precompiled or shipping targets. Set default windows resource ProductVersion to ENGINE_VERSION_STRING if BUILD_VERSION is not defined
-
Fixed a crash caused by trying to re-construct a template on top of itself when creating non-nullable object property default value.
-
Fixed undefined behavior in ManualResetEvent
-
PR #11342: Use integrated terminal for VSCode #contrib 11342
-
PR #11012: Makefile generator is now platform agnostic #contrib 11012
-
Fix UnrealTraceServer directory listening for Linux. The file notification api was not told to listen to renames.
-
Don't allow using a separate UnrealIntermediateEnvironment folder for installed engine as the intermediate path needs to always match
-
PR #10781: Apply buildconfiguration.xml to SNDBS class #contrib 10781
-
Renamed TArrayView's private namespace to match standards.
-
Fixed TWeakFieldPtr asserting with "const T" template parameters.
-
Fix broken file extension filter in FWindowsPlatformProcess::AddDllDirectory to restore the Windows dll directory cache optimization that helps with boot times on Windows.
-
PR #10683: Fix linking Shipping msvc platforms with
lld-link#contrib 10683 - -Mode=GenerateClangDatabase should use clang by default as the compiler
Deprecated:
-
Deprecated TChooseClass.
-
Deprecate GetCurrentTag/InvalidateTag and remove all calls as the feature was unreliable and is no longer used by TSoftObjectPtr
-
Added EAllowShrinking as a better replacement for bAllowShrinking parameters on containers, and deprecated the bool overloads.
-
Remove Visual Studio 2019 support
-
Removed PLATFORM_COMPILER_HAS_IF_CONSTEXPR. Deprecated CONSTEXPR, PLATFORM_COMPILER_HAS_DECLTYPE_AUTO, PLATFORM_COMPILER_HAS_FOLD_EXPRESSIONS and UE_NORETURN.
-
Removed the UE_LOG_JSON global mutex on Windows that enabled structured debug output. Integration with other tools can rely on the -JsonDebugOutput command line argument.
-
Remove defunct HybridExecutor
-
Deprecated GET_VARARGS macros and replaced them with GET_TYPED_VARARGS.
Dev Tools
New:
-
Allow enabling/disabling LiveCoding via command line switch -LiveCoding=true|false
-
Removed the more trivial C++ UHT compatibility shims in the code generator.
-
Configure multiple MemReport profiles with ini sections. Use "File" command array which outputs each command into separate file.
-
Cleaned up code generated by UHT. This includes general formatting issues and organization.
- A define ENABLE_ARRAY_SLACK_TRACKING was added to ContainerAllocationPolicies.h, which enables a SlackReport console command which generates a detailed report on array slack (unused elements in TArray containers). Useful when looking for memory savings where arrays can be more accurately sized or trimmed to size.
- Reports are generated as TSV (tab separated value) files in Shared/Logs/SlackReport, which can be loaded into a spreadsheet program. A filename can be specified, or a default one with an incrementing index will be used. Parameter -Stack=N (maximum 9) allows adjusting the stack frame depth -- setting a lower value can coalesce instances of the same allocation from slightly different call stacks.
-
MemReport now can write command's output into separate csv files for commands specified in Engine.ini in [MemReportCsvCommands] section.
-
UHT data in generated code now uses constexpr where possible.
-
Removed the MODULENAME_API from the private copy constructor definition generated by UHT.
-
CsvProfiler - Add end capture timestamp to the csv metadata. This allows easily calculating capture duration by checking the delta between StartTimestamp and the new EndTimestamp. This is much faster than trying to calculate the duration by looking at all the frame times.
-
PluginReferenceViewer - Added a context menu item that launches the asset reference viewer showing the asset references across plugins.
- Added more auxilary information to some trace scopes:
- AsyncLoading package names when LoadTime channel is activated.
- GameFeaturePlugin statemachine name during transitions.
- Scope GC incremental analysis and purge destroyed under one trace region
-
[MemoryTrace] Covered more allocations with asset metadata scopes - Added package/object/class metadata for Iris network spawned actors - Added asset metadata for ConfigFiles - Added package metadata for allocations coming from LinkerLoadPackageSummary - Added metadata for Object::Serialize allocations - Added metadata for UI/Slate and UI/UMG. - Removed metadata scope for UObjectHash/UObjectIndex global buffers realloc.
-
Add option disable/enable running after steps in LowLevelTests.xml.
-
[UE] Improve GameplayTags.DumpTagList Added an output for Sources and References for each GameplayTag Added Columns for showing if tag has Native or DefaultIni source
-
Improved error message with TObjectPtr appearing in function signatures.
-
[LLM] Disable hitchdetector when LLM is enabled It is expected that LLM capture adds CPU overhead during captures, hang/hitch detection made things just worse by spamming logs with unhelpful info.
-
Added the limited ability to add C++ attribute specifiers at the start of a UFUNCTION declaration.
-
Adding support for more complex #define scopes in UHT.
-
Adding new P4VUtil "Combine Shelves", which creates a new shelf combining multiple selected CLs, and works with both shelved and unshelved CLs.
-
Added client-side CSV stat for active replicated object count
- Added RedirectToFile dev command - Usage: RedirectToFile
[COMMAND_OPTIONS]... - It allows output the result of the COMMAND to the file specified by FILEPATH - For security purposes FILE_PATH is sandboxed: Only subdirectories inside Project/Saved directory are allowed - Command will create required directory structure before creating of the file - RedirectToFile does not work for DEFER commands and has no effect for MEMREPORT
Bug Fix:
-
Fixed UHT issue with parsing LAYOUT_FIELD_INITITALIZED
-
Fixing issue introduced into UHT that allowed unsized enumerations to be used as blueprint types. Will once again be limited to uint8.
-
Mark more SceneRender reallocations with correct LLM tag instead of EngineMisc
-
Make the XML parser preserve newlines
-
Removed usage of include file macros from Live Coding source since it was causing issues with SN-DBS
-
Fix linker issues when declaring types outside of "FunctionalTesting" that inherit from "FFunctionalTestBase"
Horde
New:
- Add idle settings to
ProgramData\HordeTrayApp\Settings.jsonwhich allow setting critical processes that should stop the local agent from processing tasks
Insights
API Change:
-
FCpuProfilerTrace::OutputEventType() and FCpuProfilerTrace::OutputBeginDynamicEvent() needs to be called only if the CpuChannel is enabled, otherwise the "spec" trace event is not emitted, so it will result in "
" cpu timers. -
FCpuProfilerTrace::OutputEventType and FCpuProfilerTrace::OutputBeginDynamicEvent needs to be called only if CpuChannel is enabled, otherwise the "spec" trace event is not emitted, so it will result in
cpu timers. Also fixed code that matches OutputBeginEvent with OutputEndEvent.
New:
-
Unreal Insights now displays the priority in package summaries to help understand the order in which packages are loaded and if package priorities are being respected.
-
Unreal Insights : delete trace is now allowed as soon as at least one deletable (i.e. not-LIVE) trace is selected so that a user can "select all" and then delete all non-LIVE traces
-
Some channels are marked read-only (e.g. memory tracing channels) and cannot be toggled while the application is running. However there was no feedback when users tried to enable those channels using console commands for example or using the public API. With this change a logging channel argument is added to several internal methods in order to output information correctly, to console feedback when needed.
-
Added memory tracing for FMemory::SystemMalloc and FMemory::SystemFree.
-
CsvProfiler: Added named events (and trace cpu timing events) also for Csv stats identified by FName.
-
Added an insights preset designed for analyzing load times that can be used by adding -trace=loading to the command line
-
Added LLM tag for untagged video mem allocation in PhysicsField.
-
Added the Windows error message to the log warning when the "UnrealTraceServer.exe" process fails to start. Also updated log messages re UTS launch.
-
Add Trace Pause/Resume menu entry to the Trace Editor Widget.
-
CONTROL_FLOW_PERF_TRACE_STEP. Adding support in FControlFlow and TRACE_CPUPROFILE macros to allow you to begin an event in a control flow node implementation and have it automatically terminated by FControlFlow whenever/however that node completes. This ensures that in a profile trace sequential steps show up sequentially rather than appearing nested (despite the technical fact that they are actually invoked as nested functions). ControlFlow is still an experimental plugin.
Bug Fix:
-
Removed leading spaces in name of PlayerController cycle stats.
-
D3D12RHI: Fixed CreateDiagnosticBuffer to use MEM_COMMIT | MEM_RESERVE (instead of just MEM_COMMIT) with VirtualAlloc in order for memory tracing to correctly track these buffers.
-
Fixed memory tracing and stats for a reallocation in GPUDefragAllocator.
-
Fixed CpuProfiler to flush the trace thread buffer (if not already empty) when the thread ends.
-
Fixed usage of TRACE_CPUPROFILER_EVENT_SCOPE macros in various engine files and in engine plugins.
-
Trace: Improved trace data writer to drain only the buffers available when we start draining buffers of a thread. This avoids cases where a thread floods the writer with new buffers.
-
Fix StartTraceSendTo blueprint
-
Fixed memory tracing to report correctly the name of the wrapped allocator.
-
Fixed usage of CpuProfiler trace in TaskTrace.
-
Fixed usage of CpuProfiler trace in BlueprintActionFilter (when ENABLE_BLUEPRINT_ACTION_FILTER_PROFILING is enabled).
-
Fixed asset metadata association with mem allocations to match LLM.
-
Fixed memory tracing for OnDllUnloaded.
-
Fixed missing ProgramSize allocations for Unix platform.
-
Fixed "Frame" CPU timing events for the Render thread to not be added when the "RenderCommands" trace channel is on. This is because the "BeginFrame" and "EndFrame" commands will define CPU scopes (when "RenderCommands" channel is on) and will overlap with the "Frame" timing event (resulting in incorrect timestamps for both "BeginFrame" and "Frame" timing events). Also renamed "Frame" to "RenderingFrame" for the timer to not be merged with one used in the Game thread.
-
Renamed the "LoadObject" named event (defined by SCOPED_NAMED_EVENT) as "StaticLoadObjectInternal" (measures time in StaticLoadObjectInternal() function) because there is another "LoadObject" cpu scope (defined using the UE_TRACE_LOG_SCOPED_T macro; the one with metadata) which measures same function.
-
Fixed tracing for stats counters (-trace=stats). For each thread, the additional buffers (after the initial buffer is flushed) had incorrect initial timestamps.
-
In certain situations thread starving can occur due to thread starving between TraceLog worker thread and tracing threads.
-
Fixed memory tracing for virtual allocs to track allocations also when just MEM_COMMIT is used (with a nullptr address).
Framework
API Change:
- Derived classes of LocalFogVolumeComponent that need tick functionality will have to override PrimaryActorTick.bCanEverTick in their constructor.
New:
-
Reworked Electra media player's DX12 support to allow for more optimized data delivery from the decoders. Also adds further optimizations if using Windows SDk 22621 or newer.
-
Fixed various issues with MediaFramework, ImgMedia, WmfMedia and Electra concerning playback timing control and blocked / sycnhed playback behavior
-
Added a flag to always make the actor spawned by a ChildActorComponent transient
-
GameFeature Plugins will deactivate any plugin dependencies that where also activated by the referencing plugin if reference includes the property "activate": true
-
Extended support for colorimetry information from video streams for non-standard HDR streams (e.g. allowing 8-bit HEVC data to use Rec2020 & PQ etc.)
-
Removing the need to create textures on-demand on the render thread from Xbox GDK playback code in Electra, hence improving decode performance
-
Added the ability to selectively activate listed plugin dependencies when a plugin is activated. The plugin reference requires the property "Activate: true"
-
Bug fix: Fixed performance issue with LocalFogVolumeComponent. Changed PrimaryActorTick.bCanEverTick to false.
-
Optional plugin dependencies need to be compiled enabled or command line enabled otherwise they are ignored during startup when the plugin manager enumerates a plugins dependency list for enabling.
-
Allowing attenuation settings to be live updated while in the editor.
-
Reworkied WmfMedia's state handling of WMF to correct playback timing and sample handling shortcomings
-
Fix reinstantiation of subobjects in CDOs and reused the same logic on instances to fix thier subobjects as well.
-
Added support for Enhanced Input show debug command to use debug target, fixing issue where show debug menu always only showed input information of first local player in a game instance even if debug target selected others.
-
Disallowed plugin entries can now contain a developer comment. Changed data type from a string to a struct. Backwards compatibility retained
-
Add support for writing JSONs with original property name casings
-
Added world name to UWorld::CleanupWorld warning to help diagnose related issues faster
-
Applied same CDO subobject fix to Archetypes
Bug Fix:
-
Fixing up some GPU state management for Electra's AVF texture sample code to fix glitchy video playback on some Apple devices
-
Fixed up SRV support for PC DX12 P010 format: plane selection code was missing
-
Fixing up texture sample setup from colorimetry information returned by Electra decoders to correctly reflect encoding vs. mastering display information
-
Fixed an issue with plugin templates where package names would fail to fix up after a new plugin is created. This can occur if two template files have the same filename but the extensions are different (.csv, .uasset). Only need to create redirectors for unmodified file types
-
PR #10885: Fix IsValidLandingSpot for Large World Coordinates #contrib 10885
-
Added ENGINE_API to ALight::PostLoad. Follow-up fix to a linker error from CL 27595673 that was reported by a licensee. If you created a custom class derived from ALight, there would be a linker error reporting a missing definition of ALight::PostLoad. The vtable of a derived class needs to call PostLoad, which requires that the symbol has been exported.
AI
New:
- Learning Agents 0.2
- Completely overhauled the LearningAgentsInteractor to allow for more sophisticated observation and action structures.
- LearningAgentsComponent classes were reparented from ActorComponents to UObjects. Introduced new "make" functions on the LearningAgentsManager.
- All blueprints need to be be rebuilt from scratch.
-
AI Path Following: Add an option to test reachability prior to updating the destination to an Actor's position
- Added new simple NNE runtime NNERuntimeBasicCpu.
AI Behavior Trees
New:
-
PR #9497: fixed mismatch in BT component description format
-
Add ability to override default blackboard key value for most types. Prevent child blackboards from being able to modify the key type of inherited key.
-
Create helper function InitializeNodeMemory & CleanupNodeMemory in BTNode to handle creation and clean up of node instance memory Update bt nodes that use instanced memory to use the new helper to create and destroy their instance memory
-
[Behavior Tree] Add support for node-specific error reporting
-
UBTTask_FindAndUseGameplayBehaviorSmartObject now reaches slot location before using object
-
Added more logs to auxiliary node and converted some EQS log to vlog
Bug Fix:
-
Fixed TimeLimit decorator when used in composite decorators Problems was that the decorator was returning a failure after requesting execution which could be the case in a composite decorator using operand
Or -
ForceSuccess decorator effect should not be limited during the search
-
Fix Behavior Tree Composite Decorator had an erroneous tooltip ("Class not found, make sure it's saved!")
-
[Behavior Tree] Fix re-opening BT assets on project start-up opens up the BB instead
-
Fixed potential access to an invalid FindInBTResult pointer in BehaviorTreeEditor
-
BTService to RunEQS should not be allowed to tick on search start to ensure proper query management.
- Updated TimeLimit Decorator to not get get ticked again in case it is still active after requesting execution (e.g. latent abort)
-
An execution is now scheduled when a task completes and there is a pending execution.
-
Fixed delta time for tasks using tick intervals Problem was that a new task to execute using tick intervals could be ticked using the accumulated delta time from the previous task.
-
Converted OnBlackboardKeyChanged delegate to a global multicast delegate so every BehaviorTreeBlackboardView linked to the modified asset can refresh their actions.
-
Fixed crash in BT that could occur if the tree was stopped the same frame one of its EQS queries finished.
-
Fix BT decorator and service lists (and also some custom licensee graph implementations) put the first and second level category on the same level
-
Fix issue where BT cooldown decorators would return false due to the last used time being 0. The cooldown calculation was also changed to prevent possible undefined behavior arithmetic.
- Prevent ForceSuccess decorator from affecting node results from unrelated nodes. Should only modify result if associated task or composite node fails.
AI Debugging
API Change:
-
Deprecating old FVisualLogger::GetEntryToWrite in favor of a new, static FVisualLogger::GetEntryToWrite for consistent Engine Timestamps in Editor.
-
- Deprecated the overload-based FVisualLogger::GeometryShapeLogf / FVisualLogEntry::AddElement API
New:
-
Encouraged Engine Timestamps by deprecating FVisualLogger::GetEntryToWrite.
-
Gameplay Debugger now selects the local Actor on start-up if no other suitable Pawns are found. Use shift-' to force select the local Actor.
-
PR #9729: Fix Visual Logger Capsule first param to match cpp
- GameplayDebugger
- adds key modifier 'Shift' support for local player selection
: Toggle debugger ON + Single best pawn candidate selection (closest to reticle) | Toggle debugger OFF - Hold
: Toggle debugger ON (if not already opened) + Continuous best pawn candidate selection (closest to reticle) - Shift +
: Toggle debugger ON + Local player selection | Toggle debugger OFF - Hold Shift +
: Toggle debugger ON (if not already opened) + Local player selection
-
Improve behavior tree debugging - Add a warning to the bottom left of the debug window when the behavior tree being debugged is paused. - Gather runtime values from instanced nodes when needed so the correct values are displayed when debugging. - Make double clicking on a dynamic subtree node open the running subtree
-
[VisLog] Improving multiple PIE session VisLog capabilities. The TimeStamp used is now a global Engine TimeStamp. The WorldTimeStamp is also recorded separately for ease of debugging. By using this Engine TimeStamp during PIE sesions, we can correctly record the time for client & server events, allowing us to see the effects of replicated data more clearly on the timeline.
- Visual logger improvements : Added sphere visual logs Added "wire" variant of various visual logs (box, OO box, cone, cylinder, capsule, sphere) Added blueprint versions of most visual logs (box, OO box, cone, cylinder, capsule, sphere, arrow, circle) Take into account the log's color's alpha value when drawing visual logs (multiplied by the scene proxy's own alpha), except for text, as is tends to become unreadable Fixed oriented box debug renders, which didn't support rotations appropriately (they wouldn't match the wireframe version) Fixed cylinder debug renders which were always vertical * Skip visual logs with empty text in the visual logger window's tooltip
Bug Fix:
- Quitting the game (e.g. ending PIE) while the Gameplay Debugger was active would prevent further messages from being logged to the screen in subsequent plays.
AI Navigation
New:
-
[Navmesh] Building actors spawned from instance actors don't dirty areas anymore (navmesh is expected to be already up to date from the instance actor being replaced).
-
Removied heavy include dependencies in NavRelevantInterface.h.
-
[Navigation] Addition of a boolean to control navigation relevancy in UGeometryCollectionComponent.
-
Removed NavigationTypes.h from NavRelevantInterface.h, StaticMeshActor.h and AITypes.h.
-
Removed NavigationSystemConfig.h and NavLinkDefinition.h from NavigationSystemTypes.h.
-
[Navoctree] Objects with empty bounds are not added to the navigation octree anymore.
-
PR #11080: Change bit-field type from int32 to uint32 in FRecastDebugGeometry #contrib 11080
-
Added cheat command 'ai.debug.nav.DirtyAreaAroundPlayer' that can be used with dynamic navmesh to dirty tiles in a square area around the local player using provided value as extent (in cm) or 10 meters if not specified.
-
Added an optional ReachCheck on NavLinkCustomInterface to allow navlinks to override the basic reach test done by the PathFollowingComponent. Improved the path ReachCheck for existing custom links.
-
Optimization to RemoveTiles and addition of profile tags to UpdateActiveTiles().
-
Addition of a warning in UGeometryCollectionComponent to catch GC that might be using bStripOnCook without bUseRootProxyForNavigation (resulting in exporting nothing).
-
Removed Actor.h from NavigationTypes.h.
-
Removed NavigationQueryFilter.h when unnecessary in headers.
-
Log invoker priority as string instead of the enum value.
-
[NavMesh] Add a NaN check to dirty area bounds.
-
[NavMesh] Added early warning for invalid bounds when creating FNavigationDirtyArea.
-
Added a new type of NavModifierComponent, that is, SplineNavModifierComponent which assigns a given nav area to all parts of the nav mesh in the vicinity of a spline.
-
[Navlink] Added custom link owner's name to link ID warning to allow identifying the problematic actor when ID clashes.
-
[Navmesh] Fixed AgentStepHeight not set in NavDataConfig.
- NavigationRelevant:
- Added flag in FNavigationRelevantData to indicates elements that want to skip dirty areas when added/removed from the NavigationOctree.
- Method ShouldSkipDirtyAreaOnAddOrRemove has been added to INavRelevantInterface to control the flag.
- UpdateNavOctreeElementBounds now takes a list of dirty areas instead of a single area to allow batched modifications.
- UInstancedStaticMeshComponent updates:
- Added a cache for navigation bounds
- Implements ShouldSkipDirtyAreaOnAddOrRemove so we don't dirty the whole area covered by the instances on registration but only a list of explicit areas using the instances.
- Added PartialNavigationUpdates for batched modifications
- Fixed partial update not sending the right area for the original position
- Added console command "ai.debug.nav.DrawDistance" to tweak navmesh draw distance at runtime.
-
Added labels indicating the number of elements in each node if octree details are enabled.
-
Fix UInstancedStaticMeshComponent::GetNavigationPerInstanceTransforms to return only the instance transforms in the provided area box as expected. This represents a significant performance improvement when using multiple instances ISM with AI navigation.
- ANavigationTestingActor
- Addition of a query to display if navigation data is ready (has been generated) within a given radius.
-
Addition of NavigationBuildDetailed CSV profile tags in the NavigationSystem tick.
-
[NavMesh] Added more information to the error message and warning messages related to the tile limits.
-
[NavMesh] Added more information when reporting the error message related to the TileNumberHardLimit. [NavMesh] Added more information when reporting the warning message related to the tile pool size.
-
ISM support for partial navigation update.
- Replaced requirement of PrimitiveComponent by INavRelevantInterface + UObject for registration to the NavigationSystem.
-
Added dedicated delegates in the NavigationSystem for UObject based registration and update.
-
Fix navmesh rasterization issue when generating navmesh high above 0.
-
Removed Actor.h from AITypes.h.
-
Removed usage of CoreMinimal.h from navigation modules.
- Updating dirty tiles:
- Optimizations when marking dirty tiles:
- Extracted finding the seeds and building sub areas to do it once for all NavData ActiveTiles now use a set instead of an array
- When using active tiles, don't try to mark dirtytiles if there is no ActiveTiles
- Added profile tags Fixed warning message for oversized dirtyarea to use the AdjustedAreaSize
- NavInvokers
- When updating invokers, use 3D invoker seed locations to compare against the maximum seed distance.
- Update InvokersSeedBounds with the vertical limits as well.
- [Dirty area] Using VeryVerbose verbosity, LogNavigationDirtyArea now logs purple boxes showing dirty areas that will dirty tiles.
-
Validating AgentMaxStepHeight in relation to AgentMaxSlope and CellSize.
-
Improve FRecastNavMeshGenerator::MarkDirtyTiles speed by prefiltering dirty area bounds using the bounds of invokers seeds.
-
Added some profile tags in MarkDirtyTiles.
-
Added extra logs when Navigation DirtyAreas are being reset.
-
Replaced custom NavLink static registration queue by a new world subsystem that will also store NavRelevant objects that are not AActor/UActorComponent based. This allows new NavigationSystem created after initial map load (e.g. ANavSystemConfigOverride) to properly recreate its custom nav link mappings and octree.
-
StaticMeshComponent is no longer relevant to navigation until compilation of the associated mesh is completed. This approach replaces the previous one consisting in returning either the render bounds or invalid bounds which could produce log spam when loading level and compiling multiple meshes.
- Added bounds to NavCollision since geometry can differ from StaticMesh
- Bumped the DDC version of the NavCollision
- Updated StaticMeshComponent to return bounds from the NavCollision when possible
- Fixed InstancedStaticMeshComponent not using the additional geometry of the NavCollision when exporting the custom navigable geomerty
- Updated InstancedStaticMeshComponent to compute bounds using the NavCollision for GetNavigationBounds, PartialNavigationUpdate and when gathering per instance transforms for navigation
- Updated UHierarchicalInstancedStaticMeshComponent to use bounds from the NavCollision for PartialNavigationUpdate
-
Use partial update when creating and destroying physics state of ISMC instead of doing a full navigation update. That prevents huge amount of tile dirtiness.
- [Navmesh] Fix navmesh sinking too far below surfaces causing navigation issues.
- Addition of a MaxVerticalMergeError and a SimplificationElevationRatio to ARecastNavMesh to allow navmesh to adapt more precisely to vertical collision variances.
-
Addition of InvokersMaximumDistanceFromSeed allowing to restrict invokers updating far from seed points (player positions by default).
-
Removed World.h include from NavLinkCustomInterface.h.
-
NavigationTestingActor: Don't reset ShowStepIndex for every request and allow to save it's value (not transient anymore).
- [Navmesh] Improved navmesh generation on steep slope:
- Fixed navmesh being generated at locations too steep and above the step height threshold.
- Addition of LedgeFilterMode on RecastNavMesh to select the desired ledge slope filter mode.
- Addition of a new filter mode that takes into account the maximum walkable slope when filtering voxels.
- [Navmesh] Tile generation debug improvements:
- addition of an options to skip contour simplification and display raw contours;
- addition of text labels to FRecastInternalDebugData;
- addition of indexes and coordinates to contour debug edges, allowing to identify them individually.
-
Add camera location to invoker seed locations when the pawn is null so nav mesh is not removed in cases where the player camera is near the invoker but the player pawn has been destroyed.
-
[Navmesh] When using a SimplificationElevationRatio > 0, navmesh contour now tessellates between regions to improve navmesh height precision.
- [Navmesh] Raw contour improvements:
- Allow merging the first contour points with the next and the last to remove differences with contours from other regions.
- When walking contours get max of neighbors height.
-
Exposed RequireNavigableEndLocation to MoveToLocationOrActor BP function.
-
Addition of the average tile generation count per second in LogNavigationHistory.
-
In UGeometryCollectionComponent, addition of a boolean to control navigation relevancy.
-
[Navmesh] Update navmesh display lines to better distinguish edges borders and polygons borders.
-
[Navmesh] Cancel async building tasks when navmesh generator is destroyed to prevent leaking any build tasks.
-
Only do navigation updates for the required instances in UMassVisualizationComponent::HandleChangesWithExternalIDTracking (instead of dirtying the whole component size).
-
[Navigation] Only update navigation for actor instances when initially populating the ISMC to prevent unnecessary dirtiness.
- Added linear extrapolation support in SplineMeshComponent
- added support to distort bounds that could exceed the mesh bounds used to define the spline local range [0, 1]
- in case point on spline is outside default range we use linear extrapolation for position or bounds
- this change also improves positioning of objects attached to sockets outside the mesh bounds
- navigation bounds are now computed and cached to match distorted navcollsion
Bug Fix:
-
Fixed possible memory corruption in SimpleCellGrid::Serialize() due to missing bounds check and integer overflow.
-
Fix voxel filtering issue when using high AgentMaxSlope values in combination with high CellSize values.
-
ISMC support for obstacles and nav areas: fix ISMC not exporting as obstacles.
-
OnNavigationBoundsUpdated, make a removal request if the bounds are invalid. This avoids having invalid RegisteredNavBounds when undoing the addtion of a NavMeshBoundVolume.
-
Fix usage of SHOW_NAV_EXPORT_PREVIEW define.
- [Navmesh] Fix navmesh tiles being removed and not generating for some modifiers when navmesh is in DynamicModifierOnly mode. (Before the change, if we were DynamicModifierOnly mode and a resolution was set, it would set the Geometry flag as well as the DynamicModifier flag, resulting in the touched tile being flushed but not fully rebuilt.)
-
[Navmesh] Fixed an issue with bFillCollisionUnderneathForNavmesh.
- ISM
- Fixed partial navigation update not using up to date navigation bounds when updating a single instance
- HISM
- Fixed missing scale support for filters used in overlapping queries
- Fixed tree marked as out of date when performing in place update (i.e. updating rotation or scale) resulting in accumulated navigation dirty areas until next rebuild. To minimize change on this fading out component we rebuild the tree instead for operations performed in non game worlds (where we expected most of this manipulations to be made).
-
Fixed issues that for both editor time and runtime, in some settings, when placing new StaticMeshFoliage or HierarchicalStaticMeshComponent in the level or changing their transform data, the Navmesh generation on them would be incorrect.
-
[Navmesh] Properly checking for extents in navmesh findNearestPoly queries.
- [Navmesh] Fixed DynamicModifierOnly navmesh missing tiles when using nav modifiers.
- When using navmesh resolution, Area modifiers are not added to ANavModifierVolume anymore.
- When adding dirty areas make sure to prevent bRebuildGeometry for game world with static navmeshes.
-
Fixed navmesh dirty area logs to display bound sizes as indicated and improved log readability.
-
[World Partition Navmesh] Fixed WP navmesh generation by setting GridSize for ANavigationDataChunkActor (needed since the addition of FPartitionActorDesc::GetEditorBounds()).
- Fixed partial navigation updates for Editor manipulations of InstancedStaticMesh component
- added partial update on component registration/unregistration
- skip updates when adding/removing instances when component is not registered
- added list of dirty areas to pending dirty element so they could be applied when udpate info is successfully processed
- added some missing updates when not using partial updates
-
[Navigation] Added support for obstacles and nav areas with Instance actors by adding bOverrideNavigationExport and bForceNavigationObstacle properties to FISMComponentDescriptor.
-
Fixed "Looking for NavData using invalid FNavAgentProperties." warning spam.
-
[Navmesh] Fix navmesh generation issue where polygon would wrongly connect to a different height, resulting in a broken navmesh surface.
-
NavModifierVolume actors getting their position updated via their parent Instanced Level Actor in the Editor now update their navigation data.
-
Added specifiers to property PerPointLaneProfile in ZoneGraph so it is properly handled by the component instance data when a BP actor is reconstructed.
-
Fix invalid memory access (use-after-free) in FGraphAStar::FindPath.
-
Added navigation update in StaticMeshComponent when associated mesh gets compiled. This will invalidate any pending add to the octree and dirty tiles since the component is no longer relevant until compilation completes.
-
Prevent ANavSystemConfigOverride from using the world if it's in the process of being destroyed in PostUnregisterAllComponents (else it will try to recreated the original navsystem in the world currently being destroyed).
-
[World Partition Navmesh] Fixed for ANavigationDataChunkActor having wrong actor location caused by missing RootComponent.
-
Fix ZoneShape visualization when re-selecting the shape or undoing actions.
-
Fixes potential crashes when invalid parameters are provided to the NavLocalGridManager
-
[Navmesh] Fixed crash in DetourTileCacheBuilder canRemoveVertex.
-
Fixed codepath in StaticMeshComponent for navigation update when associated mesh gets compiled.
-
GeometryCollectionComponent: using root proxy to take into account root particle position when computing bounds.
-
[Navmesh] Fix debug display issue in duDebugDrawHeightfieldLayer.
-
[Navmesh] Navmesh resolution from modifiers is now correctly read when used with in async tile generation combined with lazy modifier gathering.
-
Fill Collision Underneath for Navmesh on an ISM now applies to each instance.
- Fixed UpdateActorAndComponentsInNavOctree to properly update attached actors
AI Smart Objects
New:
- SmartObjects on actor instances:
- mass tag, fragments to create/destroy smart objects for Mass entities
-
Add Find Smart Object functions that take in AActor's and avoid using the normal QueryBox. This is more friendly to the UE Gameplay Framework and lets you pass in specific actor's that you case about. If you had to use a spatial query, then you may get results from objects that you don't explicitly want if they are overlapping objects.
-
Removed dependency on MassEntity to store slots
-
Added option to toggle smart object annotations in GameplayDebugger
- Added option "Slot Details" to the Gameplay Debugger to be able to reduce the amount of replicated data for worlds with large amount of SmartObjects.
- This option is required to display annotations (i.e. turning it off will disable annotations and turning on Annotations will turn this one on)
- When turned off, a single shape will represent the SmartObject in the world
-
Add two Smart Object Request Filter options to return claimed and/or disabled slots too
-
Expose some smart object component, definition, and runtime options to blueprints to make it possible to have some very basic interactions with them inside a blueprint.
-
Provide owner actor to FindSmartObject in EQS query generator
- Added reasons to control the enabled states of smart objects:
- Gameplay tags are used to identify a reason
- Default reason "SmartObject.EnabledReason.Gameplay" is a tag (UE::SmartObject::EnabledReason::Gameplay) provided by the plugin and used by default if no other reason is specified
- Tags are converted to bit masks and stored as disable flags in runtime instance
- External systems can declare new Gameplay Tags for the specific needs. System currently allows 16 different reasons (1 default + 15 custom)
- A Smart Object instance is considered disabled as soon as at least one reason is set
-
Add a "Find Smart Object from Targeting System" request to smart objects. The targeting system is often used for player interactions to determine what the player is "targeting", so being able to find the smart objects that a player is looking at will make using smart objects for player interaction easier!
-
Add some Blueprint Functionality to the Smart Object system. - BP functions for checking if slot handles are equal or not - to string functions for slots and handles - is valid functions for slot handles
- Added config to clear world preconditions for client builds
- [/Script/SmartObjectsModule.SmartObjectSettings] bShouldExcludePreConditionsOnDedicatedClient=true
- Allow smart object creation from definition, transform and owner descriptor struct that will use dynamic ids
- Replaced registration type
WithCollectionbyBindToExistingInstancein USmartObjectComponent since it can also be used for objects not tied to a component lifetime created from CreateSmartObject - Allow subsystem component accessor to force hydrate the actor associated to a smart object.
Bug Fix:
-
Mark the test smart object test types (USmartObjectTestSubsystem, USmartObjectTestBehaviorDefinition, and ASmartObjectTestCollection) as a NotBlueprintType. This prevents it from coming up in the BP context menu when using a regular runtime blueprint.
-
Display options in the GameplayDebugger are now replicated to properly display their status on the client
-
Fixed slot condition activation
-
Fix slot condition that could get activated multiple times
AI State Tree
New:
- StateTreeDebugger
- enabled by default in the StateTreeEditor
- traces can be automatically started on non-editor targets by setting 'bAutoStartDebuggerTracesOnNonEditorTargets = true in StateTreeSettings or' under [/Script/StateTreeModule.StateTreeSettings] in the .ini config file.
- traces can be manually started/stopped using
statetree.startdebuggertracesandstatetree.stopdebuggertracesfrom the console
-
Create BTTask_RunStateTree and BTTask_RunDynamicStateTree that allows the execution of state tree in a behavior tree
- StateTreeDebugger
- added option to disable state transitions
- added state transition breakpoints
- added console variable
statetree.displayitemidsto display states, tasks and transitions Ids in the StateTreeEditor (details view and state treeview)
-
Create StateTreeMoveToTask wrapping a UAITask_MoveTo allowing state tree to move AI using the same framework as BehaviorTree Create the FStateTreeAITaskBase & FStateTreeAIActionTaskBase state tree task namespace for AI focused ST task
- StateTreeDebugger
- created a dedicated option to auto-scroll and converted debugger pause to control event processing
- clear tracks when selecting new valid session
- scrub buttons can now be used as soon as analysis is pause of auto-scroll disabled
- added new button to the DebuggerView to control the session analysis state (pause or not). Mainly required when performing a remove analysis of non editor target.
- added new button to the DebuggerView to toggle auto-scroll. Manual selection in the timeline will turn it off so it can now be turned back on.
- StateTreeDebugger breakpoint improvements
- added support for breakpoint when exiting state (was only when entering)
- added support for breakpoint when entering or exiting a task
- state breakpoints can be added from contextual menu in the TreeView or from the Debug options in the details panel
- task breakpoints can be added from the Debug options in the details panel
- added feedback labels in the details panel for states and tasks with breakpoints
-
StateTreeDebugger can auto start analysis of traces started from console command
-
Added deferred stop and validation for reentrant calls to Start/Stop/Tick.
-
Add an option to retain property values when the class of a node changes
- Create IStateTreeSchemaProvider that allows a derived class to override the schema used by a parent property. Create StateTreeAIComponent & StateTreeAIComponentSchema derived from StateTreeComponent but guaranteed to have a AIController
Bug Fix:
-
PR #11008: Fix nullptr error for invalid StateTreeRef #contrib 11008
-
Fixed a bug where keyboard focus are not properly routed to WebBrowser before user interacts with the browser content.
API
New:
- Streaming improvements for fast response assets
- Fixed RequestedMips condition in FRenderAssetStreamingManager::TickFastResponseAssets()
- Call ProcessAddedRenderAssets() after Async work is complete so newly loaded meshes can be set as fast response assets. Can be disabled by setting r.Streaming.ProcessAddedRenderAssetsAfterAsyncWork=0 Streaming API additions
- Added UMeshComponent::PrestreamMeshLODs() to request the streaming system starts streaming in all LODs for the mesh; analogous to PrestreamTextures()
- Added UStaticMeshComponent::RegisterLODStreamingCallback() to match USkinnedMeshComponent
- FastForceFullyResident() returns true if the asset meets the conditions to be fast fully resident, and false otherwise
- Passing -1 for the LOD in RegisterLODStreamingCallback() asks for a callback when the maximum available LOD is streamed in.
Audio
API Change:
-
Audio decode size reduced to 4800 (100ms of 48k) down from 8k to allow for prebuffers to not stall playback. Some hardware decoders needed a subsequent fixes as were dependent on power of 2 sizes buffers.
- The function AudioModulation::GetOrRegisterParameter was updated to take the modulator name and class name directly instead of a breadcrumb with both. So if you ever call this function, you'll need to update your callsites. You can see an example in SoundControlBus.cpp.
-
The type of the TModulatorBase's Name variable was changed from an FString to an FName, so if you use that value you may need to update callsites to call the ToString method.
- Added a CVar
New:
-
Harmonix music system tools are now available as an experimental engine plugin! Design procedural music systems with the included suite of MetaSound nodes for MIDI generation and processing. Create rich, layered sounds with the powerful Fusion sampler. Manipulate sound in time with music using clock-synced modulation and effects. Synchronize gameplay and visuals with music using the Music Clock Component and MetaSound nodes for audio analysis.
-
Dynamic Submixes. Blueprint API to connect/disconnect submixes at runtime.
-
Added Quality settings to Metasounds and add logic to auto name them.
-
MetaSounds is now production-ready and out of Beta.
-
Libsndfile upgrade to 1.2.2 and add support for linux/mac. Added support for mp3/flac/opus/vorbis imports on all editor platforms.
-
Remove unneeded input binding in MetaSounds for perf
-
Added experimental MetaSound operator precaching mechanism / subsystem.
-
Tag loading behavior of soundwave using Soundclasses hierarchies. Allowing for cooked and inlined initial audio chunks.
-
Allow MetaSound Time data be used as a MetaSound Output
-
Fix quality settings named "None" causing issues with Defaults.
-
Modulation: New Blueprint Function: Is Control Bus Mix Active. Returns true whenever the given CBM is active.
-
Optimized memory allocations in DSP objects for recycled metasounds (operator cache).
-
[Metasound] NodeTestGraphBuilder: Add method for adding a constructor input which has a type that is not directly supported by FLiteral
-
Adding constructor pin to grain delay node for max delay.
-
Refactor to move all Engine (codecs) Decoders into their own modules.
-
[Metasound] Enable pin on envelope follower node
-
Added an experimental CVAR to amortize dynamic operator updates.
-
Increase streaming priority for audio stream cache reads to "normal" from "below normal".
-
Allow Quartz Subsystem to (optionally) tick when game is paused
-
Fixing ADSR discontinuity on envelope release.
-
[Metasound] Refactor UMetasoundGeneratorHandle to work with Live Update
-
[Metasound] Add Blueprint API to create FMetasoundFrontendLiteral instances of supported types
-
[Metasound] Use a map for faster generator handle output lookup. This results in a ~70% CPU time improvement.
-
Optimizations to FAudioParameter::Merge and related functions.
-
[Metasound] Use FindClassOutputWithName instead of GetOutputNodeWithName to get output metadata in FMetasoundGeneratorHandle::WatchOutputs This results in a 98% improvement in CPU time.
-
Added new MetaSound WaveTable Bank Evaluate Node to optimize against requiring memory copy of a WaveTable when interpolation between bank tables is not desired.
-
Added experimental CVAR to allow MetaSoundSourcePresets to use their parent graph instead of themselves when utilizing the operator cache.
-
Make Submix Sends UX consistent between attenuation + soundbase
-
Allow MetaSound member default literal values and read only member fields to be copy/pasted in the details panel
-
Change to using soundwave GUID as stream cache key, which should give more hits for reloads.
-
Allow XMA2 to deal with buffers that are not divisible by 256*Channels.
-
Avoid registering unused MetaSound send/receive nodes
-
String format optimization in MetaSounds
-
Making space bar preview a MetaSound in the content browser.
-
Move some MetaSound graph processing from runtime to cook for improved performance
-
Metasound per platform blockrate and samplerate.
-
[Metasound] Notify listeners only once per render block when a dynamic generator's vertex interface changes.
-
Show Source or MetaSound settings by default in MetaSound details panel, autoexpand graph member menu by default
-
[Metasound] Notify users when a generator's I/O changes
-
New Modulation Parameter: Additive. This parameter maps a given range to 0-1, and the values are mixed together by adding them and clamping the value.
-
Latch an error state in the case where the decoder returns negative samples
-
Added new USoundModulationDestination which allows users to enable modulation destinations via gameplay code or Blueprint and easily get the value on the Game Thread.
-
Add Find tab for searching within a MetaSound
- Several small changes were made to user interfaces in Audio Modulation to improve usability.
- Modulation Patches: changed the order of parameters on Modulation Patches to put the most used settings at the top of each input, set Bypass to false by default for new Patches, and changed the name of Shared curve assets in the curve selection dropdown to "Custom."
- Control Buses: Moved the Address settings and list of Generators to an Advanced category, and added a comment to the Parameter variable that explains what it does, as it's very important.
-
Added APIs to get total number of frames in a FSoundSource
- Audio can be now optionally inlined for Load on Demand.
Bug Fix:
-
Fix attenuation override not being respected within the audio interface update #contrib 11149
-
Fix MetaSound trace debug print name for graph nodes
-
Fix for DynamicSubmix's attaching to Master by accident and also submixes Auto registering AudioDevice Creation
-
BaseDefaultSubmix was not working in all situations
-
Fix MetaSound trigger parameter being retriggered on realizing virtualized sounds and unneeded parameter updates being cached while virtualized
-
Fix race condition with MetaSound async registration
-
Fix non-cooked quality settings by adding a cook stage the MetasoundSource to correctly save them out per platform. Previously the PerPlatformSettings was added to the MetasoundSettings, however as this is not a true asset they weren't being correctly cooked. The code previously pulled the global settings, then allowed overrides upon this. This decision is now made during cook.
-
Fix MetaSound reset to default arrow still showing even after literal has been set to default
-
Fixing ADSR invalid memory access.
-
Fix for a rare Audio Hang on Shutdown
-
Fix editor crash for invalid MetaSound graph connection view when previewing sound
-
Improved performance when querying Control Bus Mix Values
-
Fix Audio Synesthesia NRT editor crash when settings object is invalid
-
Fix for Metasounds not using device rate when Quality Settings are disabled
-
Fix for submix cook warning on mac/linux
-
Handle bad ADPCM decodes
-
Disable adding comment nodes in non editable MetaSound graphs like presets
-
AT9 Fix to handle non power of 2 decodes.
-
Rollback fixes around handling large truncated files, as they caused bugs with seeking for adpcm.
-
Make the Metasound CVARs a global override instead of just the defaults
-
Fix for Quality settings overriding defaults in the "0" case.
-
Several small changes were made to improve the stability of Audio Modulation during engine shutdown/PIE exit.
-
Fixed a crash when CacheSizeKB=0 was set in the ini config.
-
Fix crash caused by race condition when building MetaSound graph operators
-
Make Trim print correctly handle the uint64s
-
Fix nullptr deref after bad cast in submix register
-
Fixing tooltip typo #rd trivial
-
Fix erroneous MetaSound warning for external node classes
-
Fixed TriggerDelay node to only fire after the most recent execution of the input trigger
-
Fix for Google resonance Spatialization being incompatible w/ multi-pie.
-
Fixed an invalid read crash on Audio Mixer Shutdown.
-
[Metasound] Guard against unbounded growth of MetasoundGeneratorHandle output queues
-
Disable audio synesthesia NRT analysis for procedural soundwaves including MetaSounds
-
Fix bug in audio resampling.
-
Fixed rare crash in editor caused by Global Modulation Buses when shutting down PIE.
-
Fixed issue where FloatADSREnvelope node would drop to 0 for one cycle on trigger release if the trigger is not at the top of a block
-
Fix MetaSound Array Random node shared state not applied when No Repeats is connected to a dynamic value that changes before the Next trigger is called
-
Fix losing namespace when select click renaming MetaSound graph members
-
Fix MetaSounds not playing within Sound Cues with certain Sound Cue quality settings
-
Fixed a bug where binaural sounds would ignore submix modulation when using an external spatializer (eg. Resonance).
-
Dynamic Submixes. Fix unregistering submix on disconnect and Fix debug command to correctly view graph
-
Fixed a crash when importing ADPCM audio files.
-
Fixed an issue where FAudioCapture objects were incorrectly being instantiated when sound was disabled.
-
MetaSounds: Clamp RandomGet node's NoRepeats value immediately instead of waiting until it's saved to the RandomGets map. This fixes an issue where Shared State wouldn't work if No Repeat value was being clamped since the comparison would always indicate it needs to be stomped.
-
Fixed a crash when undoing and redoing the creation of a Metasound Source on an Audio Track in Sequencer
Deprecated:
-
MetaSound FCreateOperatorParams; Use FBuilderOperatorParams instead
-
Delete deprecated usage of GetRuntimeFormat and CreateCompressedInfo which we deprecated in 5.2
-
Remove deprecated submix code that was deprecated in 5.2
Blueprint
New:
-
Add blueprint array sort functions for native types. Adds in-place sort functions. Supports options for stable sort and ascending/descending.
-
Improved Unreal Insights instrumentation for profiling blueprint loading compilation in the editor
-
PR #10237: Convenience IsInterfaceValid() blueprint node
-
Add custom styleset support for K2Nodes
-
Animation blueprint context menu construction time has been optimized - noticeable on large projects
-
Make ENetRole available to Blueprints PR #10411: Update EngineTypes.h - ENetRole to BlueprintType #contrib 10411
-
Added Blueprint util to test whether a given class implements a given interface
Bug Fix:
-
Deferred initialization on editor load when a non-native default subobject type override has a circular load dependency with the outer object's underlying non-native type.
- Preserve the outer package dirty state after reinstancing a Blueprint object containing one or more subobjects that are no longer load-compatible with the original's serialized data.
- Example: This can occur after reparenting into a new hierarchy with matching subobjects having incompatible/downcast types. In that case, if data was previously saved using the old type, it cannot be loaded against the new type without re-saving the outermost package to update its serialized instance data.
-
PR #11332: Blueprint MemberReference now also looks for DeprecatedProperty metadata
-
Fixed redundant delegate registrations on BPGC load/compile (regression).
-
Added a way to treat composite members as complete values when generating the custom property list for the Blueprint instance post-construct initialization fast path.
-
Fixed several bugs related to inheritance of subobject data inside blueprint default objects. This fixes several sources of data corruption, but there are still some known issues with trying to use arbitrary subobjects (other than ActorComponents) inside blueprints that use inheritance
-
Fix a bug where UBlueprintEditorLibrary::RemoveUnusedVariables would still remove variables even if they had events bound to them in the graph.
-
Fixing reinstancing issue with nested subobjects and transaction buffer not collecting all subobject info
- We now clean up constructed components when using the Actor replacement workflow.
Deprecated:
- Removed blueprint code and properties for systems like nativization that were first deprecated in 5.0
Blueprint Compiler
New:
-
Improved error message when a blueprint attempts to compile while other blueprints are compiling
-
Added Archetype reinstantiation sorting and compute the right template object for creation
-
Add interface to add tags to BlueprintGeneratedClasses so BlueprintGeneratedClass assets can effectively replace BP assets.
Bug Fix:
-
AnimGraphNode_AssetPlayerBase now properly preloads animation assets that are transitively included in its graph
-
Fixed crash when loading anim blueprint with split pins
-
Fix crash when loading blueprints during asynchronous level streaming while using Play in Editor
-
PR #10869: Fixed BP compilation with deprecated event dispatchers (multicast delegates)
-
Fixed crash after recompiling a blueprint class based on a native class that has SparseClassData
-
Update UFunction::SuperStruct values in skeleton classes when relinking them during compilation. This prevents them from going stale and referencing UFunctions in a TRASHCLASS
-
Avoid potential collisions with existing non-transient objects when creating transient event stub graph artifacts during Blueprint ubergraph compilation.
-
Fixed phantom compilation error when loading a blueprint after a parent blueprint has removed a function
-
Fixed a crash involving skeleton classes after compiling complicated blueprints
-
Ensure that default values are preloaded during class regeneration. Blueprint compilation expects all of its dependencies to be preloaded. Normally, RegenerateClass handles this, but we were still missing a few cases. If we don't correctly preload dependent exports, we can run into scenarios where postloading can occur prior to preloading. This typically occurs when we duplicate various objects during compilation. We can leverage FReferenceFinder to recursively find dependent exports on the class default object to preload. Note that this only covers native export dependencies. Preloading Blueprint-generated classes (and any instances of one) can get pretty thorny during this phase, so we intentionally skip those.
Deprecated:
- Deprecated and removed broken blueprint performance tracking code that has not worked in several versions, Unreal Insights should be used for profiling blueprint editor loading
Blueprint Editor
New:
-
It is now possible to modify Class Settings in the Blueprint editor's defaults-only (DOBP) mode.
-
Improved memory usage and performance of Find in Blueprint search data
-
Loading progress for blueprint function and macro libraries is now reported more accurately
-
Implement GetOptions for
UPARAMand add it forByProfiletraces -
Macro Libraries that derive from UObject can now use functions that require a world context. The input pin for the WorldContext can be manually provided by the user by dragging the right reference and passing that into the Macro, but the Macro will also just automatically grab the world context from the caller if they have a valid world context. if they do not have a valid world context, then an error will be shown in the called at compile time.
-
Add an option to convert a comparison operator node to another comparison, like == to !=. Add the symbol to the user facing operator name for comparison operators for a nicer menu
-
Add support for units for blueprint variables (integers and floats)
Bug Fix:
-
Fix the comment bubble borders in blueprints.
-
Fixed a crash that occurs when you added a ComputeGraphComponent to a Character.
-
The blueprint editor's pin type selector has been optimized for large projects
-
Fixed an editor crash after editing Math Expression node titles while hovered over the content area.
-
Allow you to delete functions/variables in the "My Blueprint" window with backspace as well as the delete key. This makes it more consistent with the rest of the editor on all platforms
-
Fixed crash after renaming a component that was inherited from another blueprint
-
Fixed a regression that could prevent widgets from being destroyed after closing an editor window containing a graph panel.
-
Fixed up "development mode" for graph nodes to check more specifically for cook context.
-
Fixed a potential restricted mode editor crash in shipping builds.
-
PR #10747: Fix issue where graph pin hovered state becomes stuck after drag event #contrib 10747
-
Components that are placed in unexpected objects are now reported in the blueprint diff tool
-
Removed Blueprint asset sanitization from the save path to avoid invalidating harvested exports in a restricted editor mode, as well as alleviate BP compile/GC cost when multiple assets are involved.
-
Fixed superfluous warnings about new blueprints being "updated to fix issues detected on load."
-
Disable editing of the replication property in the BP details panel for Event Dispatchers. Event Dispatchers do not actually support replication.
-
Fix logic detecting blueprint subclasses in the diff panel, this re-enables logic to show differences in widget blueprints
-
Fix an incorrect tooltip on the Default Scene Root component in the subobject editor. It incorrectly said that "it cannot be copied", but it is perfectly valid to copy the scene root component and paste it somewhere else in the subobject hierarchy.
-
Fixed crash duplicating blueprint with sparse class data
-
PR #11097: Allow listener delegates to potentially mutate the managed set while iterating.
-
Fixed crash when diffing virtual revision
-
Find References: Finding references of a function call node will now do a quoted search by the function's native name rather than an unquoted search by node title. The new constructed search term makes finding function references more consistent, where it would previously fail on node titles that contain special characters or prefixes like Parent, Event.
-
Fix composite graphs not being displayed when diffing
-
Reduced some added string cost for Blueprint class assets (regression).
-
Guard against an unexpected NULL reference during explicit implemented interface removal in the Blueprint class editor.
-
Deferred validation of user-defined struct types in the pin type selector list until selection time for the member variable type widget in the user-defined struct asset editor.
-
Fixed the root cause of an assertion on Actor spawn that leads to an editor crash after undoing certain property changes that precede a Blueprint compile.
-
Fixed an editor crash that could result during propagation of a PostEditChange() event after modifying a nested struct member field on an archetype.
-
Fix GetSubsystem blueprint node to correctly handle when ShowWorldContextPin is set on a subsystem's parent class
-
Level/OFPA actor packages are no longer always being marked dirty after propagating subobject defaults in the Blueprint editor.
-
Fixed an editor crash when changing the title content on a math expression graph node.
-
Fixed the EditorUtilityWidget Blueprint asset definition to match what the Widget Blueprint asset definition does on open for edit.
-
Fixed an ensure when ctrl dragging a Vector Array pin from a blueprint function input
-
Fix ConformRemovedNativeComponents to handle components that have changed type, this prevents ConformRemovedNativeComponents from trying to destroy components that have been inherited from a native class, but some non-native class has overridden the type of the inherited component. In this case a child of that type would attempt to destroy its inherited component if it was trying to match the native parent that declared the component instead of the blueprint that overrode the component type.
-
Silenced warning when a subobject is forcibly deleted.
-
Do not show the "breakpoints" category in the right click context menu for K2Nodes if they cannot place a breakpoint. This prevents a useless empty category from being added.
-
Kick the async task queue while waiting to yield an in-progress Find-in-Blueprint global search to a GC pass on the main thread in order to avoid a potential deadlock scenario.
-
We now avoid unnecessary serialization of editor-only references at cook time when analyzing Blueprint assets for external imports.
-
PR #10335: Removed restrictions for call-in-editor Blutility functions
Blueprint Runtime
Bug Fix:
-
Optimized UUserDefinedStruct::InitializeStruct by avoiding redundant operations for STRUCT_IsPlainOldData instances
-
Fixed one cause of "Reachable garbage object" for blueprint subobjects
Gameplay
API Change:
-
UPlayerMappableInputConfig is now deprecated, you should instead use Player Mappable Key Settings on your Input Action and Input Mapping Context assets to provide the "name" of your key mapping. See Lyra for an example!
-
You can enable this check by setting EnhancedInput.Mappings.bCheckForEmptyKeyMappingsDuringValidation to true.
-
XInput 1.4 is available as a system library in Windows 10+ (the min spec for UE5), so we will now use that instead of using the older XInput 1.3 lib that is included with DirectX in the engine.
-
Use CreateDefaultSubObjects for GEComponents in the Constructor, configure them, then add them to GEComponents array. You may get ensures at runtime (with hints on how to fix) if something is wrong.
-
Added UAbilitySystemComponent::OnGameplayEffectInhibitionChangedDelegate.
-
Introduced FindAbilitySpecsFromGEHandle.
-
Introduced optional parameter to FindAbilitySpecFromHandle to handle pending adds/removes.
- Introduced some debug functionality that will attempt to catch these extremely hard to find cases where an FPredictionKey could be created and never acknowledged.
- Added console variables at the top of GameplayPrediction.h to help your upgrade path.
-
Deprecated GetSingleTagContainer on UGameplayTagsManager because it returns a raw pointer that could crash when called from multiple threads
-
Change your UGameplayEffectComponent::OnGameplayEffectChanged to use the non-const override.
-
If you have a type that inherits from CineCameraComponent and requires ticking, just set PrimaryComponentTick.bCanEverTick to true in the constructor.
- Improve comments on IsRunningDedicatedServer and similar functions to clearly indicate they are meant to be used for data loading and not gameplay purposes
New:
-
[GAS] Improving Gameplay Ability System Debuggers. Ability System Debug Commands have now been moved to a CheatManagerExtension. This allows multiple clients to use the debug commands and they will be applied to the correct client. Adding more comments and logging around why things can be rejected or work a certain way (e.g. AbilitySystem.Ability.Activate). GameplayCueManager now attempts to display the Gameplay Cues in non-overlapping fashion, so it's easier to see when multiple events occur for the same GameplayCue.
AbilitySystem debug commands are prefixed with AbilitySystem.Ability or AbilitySystem.Effect depending on if you're targeting Gameplay Abilities or Gameplay Effects.
-
[GAS] Improving VisLogging Capabilities of the Gameplay Ability System. Using the VisLog is now viable for figuring out complex interactions between Gameplay Abilities, Effects, and Attributes.
- [GAS] Improving the debug facilities. Use shift-' to bring it up for the local player.
- Gameplay Tags now show state differences between Client & Server
- Gameplay Effects now show state differences between Client & Server
- Attributes can now be debugged in the Gameplay Debugger (and show important replication state)
- Layout and color coding have been improved
-
Deprecate UPlayerMappableInputConfig in favor of the new UEnhancedInputUserSettings with 5.3.
-
AggregateGeom (more accessors); Adding ways to get a shape by the name and get the shape index by name. -- Code -- AggregateGeom: GetElementByName() - Goes through shape arrays and returns the first found element that has the passed in name. GetElementIndexByName() - Goes through the shape arrays and returns the first found index for the element that has the passed in name. GetElementByName() - Templated version to reduce shared code. GetElementIndexByName() - Templated version to reduce shared code.
-
[GAS] Exposing Gameplay Effect's GetAssetTags / GetGrantedTags to Blueprints
-
Add a cvar to check to enable checking for keys mapped to EKeys::Invalid, which will allow for some better content validation if desired.
-
Added a way to temporarily defer rebuilds of the GameplayTag tree managed by the GameplayTagsManager, along with a means for manually rebuilding the GameplayTag tree.
-
Update to XInput version 1.4. Instead of requiring the XInput 1.3 dll from DirectX, we can just add a system dependency and it'll work. 1.4 brings some small improvements and bug fixes and is the default that is shipped with Windows 10.
-
Add a flag on Default Mapping Contexts for Enhanced Input to register with the User Input settings by default.
-
[GAS] Adding more data in the Gameplay Ability Audit
-
Added new Blueprint functions for converting multidimensional array indices. Specifically, this adds conversion functions for 1D -> 2D, 1D -> 3D, 2D -> 1D, and 3D -> 1D indices. For example, in a 3x2 array, converting the 1D index 4 to a 2D dimensional index would yield (1,1). Tests were also added, which demonstrate usage and expected output. #virtualized
-
[GAS] PR #10717: Optional parameter to GameplayTagCountContainer::Reset allows a user to empty the container while keeping all of the registered tag count change callbacks.
-
[GAS] It is now easier to implement native GameplayEffects properly.
-
[GAS] PR #11505: Add on gameplay effect inhibition changed delegate #contrib 11505
-
[GAS] Gameplay Debugger now reconciles Server vs. Client state for Gameplay Effects, similar to how Tags and Attributes work.
-
Added a non-const getter to allow classes running in editor to modify the Actions list in GameFeatureData
-
SpeedMultiplier property on InterpToMovementComponent so the timing of its movement can be changed even after it has started its move.
-
[GAS] Made it clear that we currently do not support replication when using InstancedPerExecution GameplayAbilities.
-
Add the ability to bind lambda expressions to the Enhanced Input component outright. Also mark the delegate handles as protected instead of private so that users can more easily extend upon the Enhanced Input component and add more binding options to it if they want.
-
[GAS] Changed the friendly DisplayNames of the GameplayEffectComponents to make them easier to comprehend. Inspired by PR #11357.
-
Gameplay Ability System: Added a serialization operator<< implementation for FGameplayAbilitySpecHandle so users can invoke serialization on a FGameplayAbilitySpecHandle if needed. This allows FGameplayAbilitySpecHandle to be a member of structs that override NetSerialize().
-
Added a new Preload In Commandlets option to the 'Add Data Registry' Game Feature Action. When enabled, the specified data registries will be preloaded when running editor commandlets. Useful for commandlet automation of editor operations that rely on Preload In Editor (which does not itself cause preloading of data in Commandlets)
-
Add FBox Blueprint callable utility functions.
-
Adjusting Data Registry Register Asset Result changes to be more informative for how to upgrade to the new Engine version.
-
Target Selection Task: Added the ability to perform target traces using capsules and boxes in addition to the existing line and sphere traces.
-
[GAS] PR #10711: Create FGameplayTagCountContainer::GetExplicitTagCount.
-
Adds functionality to allow a character to stay based while jumping on a base, as long as the base is under the character.
-
Added a way to temporarily override how the GameplayTagsManager handles unloading of GameplayTags in response to removing INI search paths.
-
Added option to ProjectileMovementComponent to use scoped movement updates during simulation for cheaper movement/transform updates when processing multiple movements (sub-stepping or deflections). New flag: bSimulationUseScopedMovement (default false, as the delayed impact events could change behavior, use with care).
-
Gameplay Tag Manager: Adjusted the loop in "UGameplayTagsManager::StaticGetCategoriesMetaFromPropertyHandle" to break early if the outer base class of a child property and its parent are of a different type. This helps us avoid situations where a suboject's gameplay tag property may inherit meta categories from a different class it didn't expect and cause unintented restrictions on the child tag property.
-
Targeting System / Sort By Distance: Added option for more accurate distance calculation based off of nearest collision surface instead of actor location.
-
Add WaitGameplayTagChanged async tasks (ability and actor versions). This task allows reacting to all tag count changes as opposed to just Add and Remove.
-
Added a non-const getter to allow classes running in editor to modify the Actions list in GameFeatureData
-
[GAS] Instant and Periodic GameplayEffects now respect Modifier tag requirements
-
Added an option for ProjectileMovementComponent to avoid interpolation transform updates on some frames when an object isn't as relevant. Default version is based on not recently rendered but this can be extended.
-
Added new Input Modifier - Smooth Delta. It provides a normalized smoothed difference between the current and last input value, which options on how the value is calculated for different behavior. For boolean Input Values, it just returns the boolean as is.
-
[GAS] Gameplay Cue Unit Tests
-
Added a OnSubsystemInitialized callback to UDataRegistrySubsystem, notifying when all known data registries have been scanned and initialized.
-
Add an IsDebugCameraActive method to Cheat Manager
-
PR #9012: Ensure only plugins in the GameFeatures/ folder are considered as GameFeatures.
-
[GAS] PR #11483: Adding Debug support for GameplayAbilityTargetActor_Radius
-
Update
FilterArray's result be auto-cast to the filter type -
[GAS] Added a first pass of Gameplay Ability System plug-in documentation markdown. Accepting PR's!
-
Update the comments on bIgnoreAllPressedKeysUntilRelease to be clear and provide some examples.
-
Optimize UGameplayTagsManager::GameplayTagsMatchDepth to remove excess allocations.
-
Allow cheat manager extensions to respond to adding/removing from cheat manager in native code.
-
Update the comments on the Enhanced Action Key Mapping and the Input Action asset to be very explict about the order of which modifiers are applied.
-
[GAS] Introduced UGameplayEffectComponent::OnGameplayEffectApplied which corrects the rules for applying stacked GameplayEffects. The rules are simpler for Applied, but the other functions (Executed, AddedToContainer) still exist due to the complex rules.
-
Added a new "Max Once Per Frame" parameter to TimerManager timers to allow opting out of "catch-up" behaviour where the timer callback will run as many times as would fit in the current frame delta. For example, a looping timer with interval 0.001s would run 9-10 times in a frame with delta 0.01s.
- Add GetOwnedGameplayTags and GetBlockedAbilityTags that return a const-ref to avoid allocating and copying
Bug Fix:
-
[GAS] Fixed an issue where AbilitiesGameplayEffectComponent could fail to grant and remove abilities if those abilities were granted/removed during the same scope lock (due to the PendingAdds/PendingRemoves).
-
Fix DataRegistry issue where an invalid table source would break the cache for other sources, and add extra validation for invalid sources
-
Gameplay Tags: The native method for resolving a gameplay tag, FGameplayTag::RequestGameplayTag(), now applies tag redirectors.
-
Fix for a crash when changing the class or a subobject marked as "Within" to a BP subclass instead.
-
Gameplay Ability System: AbilitySystemComponent will now correctly perform cleanup in DestroyActiveState after leaving, re-entering and leaving play again via level streaming (including world partition) and seamless travel.
-
Fixed GameFeaturePlugin config inis not applying config values to blueprint classes.
-
[GAS] Various FPredictionKey Fixes.
-
[GAS] Skip the check for unmapped references when receiving the replicated Server Initiated Gameplay Effects. This ensures the Gameplay Cues will always fire properly.
-
[GAS] Handle 0.0f and negative time input values on GameplayTask_WaitDelay as finishing on the next tick. inspired by #contrib 11079
-
UE-143412 - Using Collapse to Function inside of a thread safe graph does not mark the resulting function as thread safe Since the nodes in a threadsafe function are threadsafe, it follows that the collapsed graph is also threadsafe. Not doing so creates a clumsy workflow: the Blueprint will fail to compile until the user manually marks the collapsed function as threadsafe.
-
Fixed root motion replication to proxies when finishing root motion to ensure the replicated shadowed state is correct on the frame that root motion finishes.
-
[GAS] PR #7531: GAS stops search for PC only if valid PC is found
-
[GAS] Ability System Debug HUD now uses the correct source for CanActivateAbility.
-
Fixed issue where loading Gameplay Tag Containers before the tags were registered would cause non-exact matches to randomly fail
-
[GAS] Gameplay Effects could previously hold on to old GameplayTags (they were stored in deprecated variables)
-
[GAS] PR #10922: fix removing gameplay effect delegate handle
-
Common Conversation Plugin: Changing ExitTag generation when compiling conversation graph assets to use
AddTaginstead ofAddLeafTag. Using the leaf version was causing issues for conversation graphs that used both a a child and a parent tag for two different exit points. The result was the parent tag exit point getting ignored and thus that exit point not counting as a dependency for the given conversation asset, which could butterfly effect into sync loads because the given graph is not pre-loaded properly when readying a conversation component. - Affected Conversation Graphs will need to be re-saved for the fix to take effect. -
[GAS] UGameplayEffectComponent::OnGameplayEffectChanged has been changed to non-const to allow the proper flow of updating its values on Post Blueprint Compilation.
-
[GAS] Ensured all FScopedServerAbilityRPCBatcher prediction keys generated in its batch are dependent.
-
[GAS] Gameplay Cue Notify Actors are now removed properly on Listen Server instances.
-
[GAS] FActiveGameplayEffect::GrantedAbilities was not handled property in copy/move constructor/operators.
-
[GAS] AbilitySystemComponent::NotifyAbilityEnded was marking Gameplay Abilities as Garbage, but they could still be used in later functions.
-
[GAS] PR #11117: Fixed typos and wrong parameter name in comments in the AbilitySystemComponent header file
-
Added scoped movement update for character mesh to avoid redundant movement of mesh children during multiple scoped moves within CharacterMovementComponent. Also cleaned up previous scoped update into it's own wrapper struct to make it easier to use and find uses of that versus other scoped moves.
-
Gameplay Tags: Fixed FGameplayTag and FGameplayTagContainer pin value modifications not being undoable/redoable. Now properly creates a transaction in Undo history. Additionally, the pin "Reset to Default Value" action now also creates an undoable transaction.
-
GitHub 11226 : Fix newline escaping in DEFINE_TARGETING_DATA_STORE A backslash shouldn't appear on the last line of a macro definition. The continuation of the newline can potentially yield compilation errors on some platforms. #contrib 11226
-
Fixed handling of character movement timestamp resets that arrive during ForcePositionUpdate, so they correctly trigger timestamp reset callbacks and sync the time correctly. Fixed APlayerController::TickActor() not resetting forced update state once good new moves had been received, it was waiting on the max timeout period first.
-
[GAS] PR #7661: Mark functions as virtual in AbilityTask_WaitTargetData.
-
UCharacterMovementComponent::RoundAcceleration() changed to match the same rounding and clamping that is used by replication of FVector_NetQuantize10.
-
[GAS] Removing a GameplayEffect that uninhibits while being removed would previously cause an ensure to happen. This is actually a valid use case.
-
[GAS] Fix TryActivateAbilitiesByTag crash due to iterating on pointers on a mutable (resizable) array of ActivatableAbilities.
-
[GAS] Fixes for GameplayCueNotify OnActive executed twice for Duration GEs on Standalone + ListenServer in Mixed/Minimal Replication Mode.
-
Avoiding potential double registration of static mesh proxies after moving an actor, this fixes one cause of "Assertion failed: !Primitive->SceneProxy"
-
[GAS] GameplayEffect's GrantedAbilities were not auto-upgrading properly. Removing GrantedAbilities in a child GE would previously not be respected upon upgrading.
-
[GAS] Fix for newly created Gameplay Effects not getting their proper version number set to latest (and therefore not working correctly until an Editor restart).
-
Character movement should attempt to base on cluster unions - not the underlying geometry collection.
-
Gameplay Abilities System: Fixed a client-side crash when an Attribute Set is removed server-side prior to or at the same time as a Gameplay Effect is removed that modifies an attribute from that set.
-
[GAS] Moving the GameplayEffects logs from LogAbilitySystem to LogGameplayEffect. Enhancing the locations of the logs to provide better context to what is happening.
-
[GAS] Fixing a regression where Gameplay Cues may receive two OnActive calls when executed by a non-instant Gameplay Effect.
-
[GAS] Fixed AbilitySystemGlobals resetting the FActiveGameplayEffect Handle Cache too early (during a map change).
-
UE-203565 - OnBrowseSocket BP Menu failing to open when the SubobjectEditor list is docked to the side panel or closed. When a window is docked in the Blueprint editor, it gets added to the STabSidebar, which is created by the toolkit host. If we use the current SSubobjectEditor as the widget path, we won't actually find a window, because it now lives under the STabSidebar. As a result, the drop down menu for mesh sockets would fail to open. The easiest fix is to simply use the toolkit host's parent widget, which finds the correct widget path in the docked and undocked cases.
-
Gameplay Abilities System: Fixed a client-side crash that happened when showing a GameplayAttribute debug view with the console command AbilitySystem.DebugAttribute
when the server has applied runtime constructed GameplayEffects, due to those being replicated with null Spec.Defs. -
Fixing a non-deterministic replay crash caused by level streaming not always completing during replay playback by the same frame it completed when recording the replay. This could result in dropping dependent packets or delivering them out of order in a way that the client isn't expecting to handle. Created a new cvar demo.DoNotDropPackets which will prefer to pause the playback until the prerequisites are satisfied. Gating behind a cvar to ensure backward compatibility and because dropping packets is required to ensure consistent framerate (at the cost of further reducing determinism).
-
Fixed a performance regression of USceneComponent::GetChildComponent() from unnecessary implicit TObjectPtr conversion.
-
Added an explanatory message to !IsUnreachable() assertion failure in UObject::ProcessEvent().
-
Fixed CineCameraComponent registering for tick in builds where it won't do anything useful.
-
Data Driven CVars now show their tooltip as hint text in the in-game console when suggested by auto-complete.
-
Do not attempt to load the project default IMC assets on the CDO of UEnhancedPlayerInput. Doing so will result in any subobjects of the IMC (triggers, modifiers, player mappable key settings) being null at the time of loading if they are outside the Enhanced Input module. We can't guarantee that the load order of these modules such that they would be available before the EI module is being loaded, so we can just skip them here.
-
Making sure FGameplayTag meta properties of Categories and GameplayTagFilter are interchangeable and case insensitive
-
ChildActorComponent no longer holds onto its ChildActor if it has already been destroyed - this prevents a 'reachable garbage object' warning related to ChildActor objects.
-
Gameplay Ability Montage / Bug Fix: Fixed montages not replicating what section to play on simulated clients when the AbilitySystemComponent is set to only replicate the current montage section instead of the percise montage position. The current montage section would only be replicated when jumping to a section, and not when naturally transitioning from one section to the next. This has been fixed by ensuring SectionIdToPlay is updated in AnimMontage_UpdateReplicatedData. NextSectionID is now also utilized when only replicating section to improve the transition between sections.
-
[GAS] Allow Gameplay Abilities to use Blueprintable Replicated Variables.
-
Fix a bug where the "OnForceFeedbackFinished" on Force Feedback component would never be called.
-
Fixed cases where mid-tick changes in movement mode could continue movement with the old mode's Phys** function in a customized CharacterMovementComponent
-
UE-203280 - Blueprints from UE4 with dangling delegate reroute node crashes on UE5 load GetLinkedDelegateSignature has a fairly aggressive assert. It's entirely possible that a knot (reroute) node doesn't have an output linked. In those cases, we can safely break out of the loop, since there won't be a linked delegate signature.
-
Fix an error error when overriding vector axis key bindings on an input component.
-
Shorten GFP plugin identifier to just be the leaf file name. This avoids issues with non-normalized paths.
-
Fix crash when trying to delete an in-use DataRegistry source in the editor
-
Prevent a crash on the player controller when attempting to restart the player if the game mode was null. So far the only known case of this happening is if you delete everything from an active PIE session and then attempt to respawn the pawn. Now instead of crashing, we wil log that it is happening and early exit.
-
Fixed issue in CharacterMovementComponent where a delayed movement adjustment would have the adjusted movement mode overwritten with the current mode, sometimes resulting in a mismatch and further corrections
-
Fixed issue where a character could intend to stay vertical (aligned with gravity) but unable to change pitch or roll to get there.
-
[GAS] Properly dirtying the ActiveGampelayEffects array when granting a new Gameplay Ability Spec Handle.
-
UE-194830 - The Blueprint compiler is not consistent with UHT when generating DefaultToInstanced variables Object properties that reference a DefaultToInstanced class also need to set the "EditInline" metadata to true. Otherwise, this property can't be instanced in the editor. This mimics UHT's behavior for UhtObjectProperty.
-
Fixed a few different crashes that were a result of a replicated LevelSequenceActor being recreated on client, but using a SequencePlayer from a previous, destroyed copy of that actor that hadn't been garbage-collected yet.
-
[GAS] Ensure that UAbilitySystemGlobals::InitGlobalData is called if the Ability System is in use. Previously if the user did not call it, GAS did not function correctly.
-
Gameplay Ability System: Fixed a crash that happened when a GameplayAbility destroys its owning actor on ability activation, due to actor destruction attempting to clear the ability list while in an ABILITY_SCOPE_LOCK. Calling ClearingAllAbilities() while in a scope lock will now defer the action until the end of the scope. Abilities are now allowed to destroy their owning actor on ability activation.
-
Gameplay Ability System: Fixed a crash that happened when an AbilitySystemComponent has pending TimerManager callbacks from GameplayEffects with durations when it's unloaded as part of a sublevel. ASC now correctly clears pending TimerManager callbacks on removal from world.
-
Fix route gamepad to second window. Gamepad input was never being routed to the next viewport client during a PIE session with multiple viewports.
-
Make the Enhanced Input BP node module PreDefault instead of Default. This fixes a bug where enhanced input nodes would sometimes not be loaded in template C++ projects.
-
[GAS] Ensured FPredictionKeys only attempt to "catch-up" if they were locally generated.
-
Fixed it so actors that are spawned during world initialization will not call PostRegisterAllComponents (and related functions) twice. s.OptimizeActorRegistration can be used to restore the old behavior or add additional error logging
-
Optimize TQuat
::Slerp_NotNormalized(). Removes 1 branch, based on negative angle identity for Sine function. Added startup tests to validate old versus new function and also test both versions for both positive and negative 'RawCosom' values (not previously tested). -
Fix GameFeatureAction_AddAttributeDefaults not cleaning up references to objects when unregistered
-
[GAS] Fixing up a case where OnRemoveAbility would not EndAbility on a non-instanced Ability that was still Active.
-
[GAS] PR #10474: Update
GetAbilitySystemComponentto default parameter to Self -
Fixed inconsistent tooltip for Blueprint config variables. GetConfigName doesn't always return the base name of an .ini file, which is what we want. For example, if the class uses DefaultEngine.ini for its config values, GetConfigName will return the base name, "Engine". However, if the class uses DefaultEditor.ini, GetConfigName returns the path to the merged .ini file that's located under the game's "Saved/Config" directory. Since ClassConfigName corresponds to the base name of a config file, we can just use that for the tooltip.
-
[GAS] PR #11119: GameplayEffect ApplicationRequirements Upgrade Fix
-
Expand the use of UProperty's ForceRebuildProperty to include properties inside nested properties such as UStructs.
-
Add location to HitResults from Targeting Selection Task AOE
-
Fixed issue where transient DataRegistry data sources were not being correctly removed from the RuntimeChildren array when a registry was Deinitialized
-
[GAS] PR #6354 : Fix ability montages stopping abruptly on simulated proxy
-
[GAS] PR #10990: GAS Montage Section Crash Fix
-
[GAS] When using ForceReplication on the AbilitySystemComponent, also call ForceReplication if using a ReplicationProxy Actor to ensure the prompt delivery of GameplayCues and GameplayTags.
-
[GAS] PR #8063: FGameplayEffectContextHandle : Check is data valid before retrieve "Actors"
-
Fixed for GameplayAbilities not always being removed from the ReplicatedSubObjectsList prior to being marked as garbage
-
[GAS] PR #7542 : Retain rotation for GAS Target Data LocationInfo
Deprecated:
-
[GAS] Cleaning up some misconceptions (and bugs) about dependent FPredictionKeys inside the Ability System. We no longer replicate FPredictionKey::Base because it's never used. Inspired by #contrib 11151
-
The FPlatformNamedChunkInstallDelegate has been deprecated in favor of the more extendable FPlatformNamedChunkCompleteDelegate.
-
[GAS] InhibitActiveGameplayEffect was reusing an ActiveGE which could have been invalidated. Deprecating that function in favor of SetActiveGameplayEffectInhibit to make it clear to users this can happen.
Mass
API Change:
- Where before INDEX_NONE was previously used to denote an 'invalid' StaticMeshDescIndex (e.g in FMassRepresentationFragment), we now use FStaticMeshInstanceVisualizationDescHandle::InvalidIndex to denote invalid Mass static mesh instance visualizations.
- FStaticMeshInstanceVisualizationDescHandle itself does have special case handling to internally convert INDEX_NONE to the new InvalidIndex value on construction, which should catch most cases automatically, however it's recommended for any comparisons of StaticMeshDescIndex against INDEX_NONE to be explicitly converted to the new InvalidIndex value. To ensure comparisons aren't silently mismatching against the old INDEX_NONE, StaticMeshDescIndex has been renamed to StaticMeshDescHandle in FMassRepresentationFragment to force the breaking change.
New:
-
MassAI - Added gdt.mass.ToggleDebugLocalEntityManager console command to toggle between local / remote entity manager debugging in the Mass gameplay debugger category. Useful if your game is overriding the default shortcut (Shift + L).
-
Made UMassActorSpawnerSubsystem::ReleaseActorToPool a virtual method to allow subclasses to customize actor pooling behavior.
-
PR #9620: Fix typo in MassEntityZoneGraphSpawnPointsGenerator.h
-
Added support for all owned queries for processors inheriting from UMassSignalProcessorBase
-
Added GetNumMatchingEntities overload to FMassEntityQuery for calculating the number of matching entities in an FMassArchetypeEntityCollection array.
-
Added mass.debug.Representation CVar similar to mass.debug.RepresentationLOD to debug draw representation states for entities. Also added the ability to set both mass.debug.Representation and mass.debug.RepresentationLOD to 2 to VisLog states instead, or 3 for both VisLog and debug draw.
-
Added UPROPERTY markup to various fragment struct members for text export. This allows them to appear in the Mass category of the AI gameplay debugger when inspecting fragment values on a debugged entity.
-
PR #9351: Fix typo in MassVisualizationComponent.cpp error message
-
Mass Visualization - Switched signed int16 StaticMeshDescIndex handles to new explicitly typed FStaticMeshInstanceVisualizationDescHandle which uses unsigned uint16 internally, to double the number of possible ISMC visualization registrations.
-
Added mass.debug.Representation.MaxSignificance and mass.debug.RepresentationLOD.MaxSignificance CVars to limit debug drawing for performance and readability with large agent counts.
-
Added const and non-const shared fragment accessor methods to FMassEntityManager.
-
Replaced FMassTagBitSet with FMassArchetypeCompositionDescriptor in the MassExecutionContext. This follows the addition of DoesArchetypeHaveFragment which originally used the fragment view, making the lookup more expensive than it needed to be. This change gives access to the full bitsets used by an archetype to provide a more efficient lookup as well as room to expand in the future for other types of fragments.
-
MassVisualizer actors are no longer visible in the outliner so user can't delete them.
-
PR #9326: Fix typos in comment in MassAgentComponent.h
Bug Fix:
-
Updated some processors that shouldn't run in Editor
-
Fragment data is now always applied before notifying observers when adding new fragments instances
-
PR #10931: Fix MassRepresentationAccessMode Made an additional fix to another query detected by checkSlow #contrib 10931
-
Fix false positive error log for reaching the loop maximum when flushing Mass command buffers.
-
MassRepresentation processor dependency ordering fixes: Added UE::Mass::ProcessorGroupNames::LOD to ExecuteAfter dependencies for UMassRepresentationProcessor by default, to ensure LOD computation occurs before MassRepresentationProcessor tries to enact the requested LOD's representation changes. Also put UMassStationaryISMSwitcherProcessor.cpp in the Representation processor group, still keeping it's explicit ExecuteAfter of UMassVisualizationProcessor within the group.
Networking
API Change:
- When running with Iris enabled, the following CSV stats will no longer output a value (previously would just output 0):
- GatherPrioritizeTimeMS, NumOpenChannels, NumSkippedObjectEmptyUpdates, NumTickingChannels, ReplicateActorTimeMS, SharedSerializationPropertyHit, SharedSerializationPropertyMiss, SharedSerializationRPCHit, SharedSerializationRPCMiss
-
Changed UNetDriver::ERemoteFunctionSendPolicy from an enum to an enum class so you may have to fully scope it if you were using it in your code.
- When running with Iris enabled, the CSV files will now include metrics for:
- ReplicationBridge_PreUpdate, ReplicationBridge_PollAndCopy, ReplicationSystem_UpdatePrioritization
New:
-
Iris - Added filter inclusion group feature. Filter inclusion groups are processed after dynamic filtering, filters implemented via UNetObjectFilter implementations, and their only purpose is to optionally enable replication of objects that were filtered out. This allows for example an object to be spatially filtered out but then enabled by a team or view target group for example. No such groups are implemented by default, it's up to the user to implement the relevant game logic to create, update and destroy such groups. Only root objects may be added to filter inclusion groups, subobjects will be filtered like the root object.
-
Add some replication testing utilities & a test case for renaming dynamic actors on servers. UE::Net::FTestWorldInstance and and UE::Net::FTestWorlds enable writing synchronous test cases within the scope of one function that create full UWorlds and utilize the whole networking & replication path. Useful for testing features that rely on worlds, actors, streaming levels, etc. The worlds created are PIE worlds and they currently only work in the editor.
-
Added console command to set nettrace verbosity at runtime - NetTrace.SetTraceVerbosity [verbositylevel]
-
Added log in NetDriver initialization telling what replication mode its set to.
-
Deprecated FFastArraySerializer::FPostReplicatedReceiveParameters::bHasMoreUnmappedReferences as its behavior is inconsistent and code should not rely on it.
-
Added cvar net.SerializeNewActorOverrideLevel to optionally bring back the functionality of not serializing a replicated, spawned actor's level, which will cause it to spawn in the persistent level on clients, regardless of its level on the server.
-
Iris - Implemented support for Apply in FNetSerializer. If implemented it will be called when pushing received state to the target state. FRepMovementNetSerializer makes use of the new functionality to avoid overwriting quantization levels.
-
Iris - Add concept of Ordered RPCs. Unicast RPCs are now ordered with respect to reliable RPCs and other unicast RPCs targeting the same actor. From client to server all reliable and unicast RPCs are ordered with respect to eachother, regardless of target actor.
-
NetDriver * Added exclusive csv cpu scope to FlushNet call to track time spent inside NetworkHandlerComponent (compression, encryption, socket send, etc.)
-
Net.DebugDraw 1 now showing NetGUIDs
- Added some optional handling of replicated actor outer changes on servers.
- Only supports dynamically spawned actors, not placed actors
- ReplicationGraph support added and toggled with the cvar Net.RepGraph.HandleDynamicActorRename
- Cvar net.CleanUpRenamedDynamicActors will tell clients to destroy an actor if the server moves it to a level that's not currently visible on the client (disabled by default to preserve current behavior)
-
Stripping non-iris CSV net metrics when running Iris NetDrivers. Previously all these were set to 0 and output every frame, so this should reduce raw csv size quite a bit. You can now also define these in BaseEngine.ini
-
Iris - EndReplication now handles ending replication for objects marked as garbage. - Fixed ensure when executing DestructionInfos for objects with SubObjects
-
Added optional cvar net.ClientIncomingBunchFrameTimeLimitMS to amortize incoming network processing over multiple frames, as an option to trade off some latency for frame time. Disabled by default.
-
NetDriver: Added engine crash context "ReplicationDriver" * Set to Generic, Iris or the class name of the replication driver
-
Iris: Added ability to prefer a Replication System via the GameMode class. When a game mode selects a specific replication system, the server will create its GameNetDriver using that mode if compatible. Note that the clients are NOT able to ask the game mode for the proper repsystem, so use this only when you can correctly predict the proper mode before connecting on the server. Otherwise the clients may disconnect due to incompatible netdrivers. PIE clients started inside a single process will use the correct repsystem of the dedicated server. Setting -UseIrisReplication=0/1 on the cmdline will override the GameMode's requested system.
-
Changed UNetDriver::ERemoteFunctionSendPolicy from an enum to an enum class
-
Iris: The GameInstance can now request a replication system via GetDesiredReplicationSystem
-
Network: Improved handling of ack history overruns which will no longer cause false negatives, if we overshoot ackhistorybuffer client will now flush the sequence history before accepting new data packets.
- NetDriver:
- Added tracking stats to NetConnection that track number of rpcs delayed by unmapped guids and how many frames they were delayed by.
- Added tracking stats to NetDriver that track number of reliable bunches.
- Added console cheats to force only unreliable RPCs to be dropped. This can be used to better simulate a scenario where specific unreliable RPCs get dropped and not resent but not the adjacent property data sampled the same frame. Useful to test gameplay code using unreliable RPCs.
- NetEmulation.DropAnyUnreliable : drops a % of all unreliables sent
- NetEmulation.DropUnreliableOfActorClass: drops a % of all unreliables sent by a specific class
- NetEmulation.DropUnreliableOfSubObjectClass: drops a % of all unreliables sent by a specific class
- NetEmulation.DropUnreliableRPC: drops a % of all unreliables of the passed function name.
- NetEmulation.DropNothing: stops dropping unreliable rpcs
-
Adding CSV stats for Iris PreUpdate, Polling and Prioritization
-
NetDriver: Now collecting the amount of packets sent & received by each connection each frame. Outputting in csv profiler the average and max per-connection packets received and sent every frame. Added net.ForceOnePacketPerBunch cheat to force every packet to contain a single bunch. This can be used to debug rare ordering issues when two actors are dependant but should not.
-
Added logging of actor & property name for more cases of replication serialization errors.
-
Increased the reliable buffer for replicated bunches to 512.
-
Added LogNetTraffic error that tells which RPC failed to send when the reliable buffer overflows.
-
Iris: Added support for sending attachments flagged as SendImmediate from PostDispatchTick
- Added ValidateActorReferences to RepGraph and RepGraphNode types * Iterates over all nodes in the RepGraph and checks for potentially stale actor references
Bug Fix:
-
DemoRecording: Fix CanSkipUpdate when demorecording is enabled alongside an Iris netdriver PushModel is not enabled to generic NetDrivers when Iris is enabled in another net driver.
-
Fixed issue where some exports was not properly exported with recorded demo frame if exported by checkpoint causing bunch errors due to not all must be mapped exports being registered.
-
Add P_GET_WEAKOBJECT_NO_PTR and P_GET_WEAKOBJECT_REF_NO_PTR script macros to avoid issues with repnotify functions for TWeakObjectPtrs that pass in the old value.
-
Fix crash with GameplayDebuggerCategoryReplicator when its held by ReplicationGraph. Setting it bReplicateToOwner should only have been done when Iris is actually running.
-
Iris - Fixed issue where object could get stuck in state waitforcreateconfirmation, if cancelling creation, and then cancelling destroy.
-
Networking: Replicated components added in the ConstructionScript of a blueprint class will now be considered netaddressable and properly mapped on the client instead of instantiated twice. * Now ensuring when we start replicating a dynamic UserConstructionScript component that is built from an archetype different from the class CDO. The client version of such components were always initialized using the class CDO and probably initialized wrong.
-
Iris: Fixed disconnect issue on clients due to server sending more data to not yet acked hugeobjects.
-
PushModel: Fix RemoteRole not synced correctly when push model is enabled * Calling ForceCompare() will now force push model properties to be evaluated even if they are not flagged dirty.
-
Fixed an issue where replicated actors may not replicate correctly if they're dormant and have dormancy flushed while a client doesn't have the actor's level loaded. Controlled by cvar net.FlushDormancyUseDefaultStateForUnloadedLevels.
-
Iris: Keep reliability as is when splitting a NetBlob. Split unreliable multicast RPCs will now also keep their normal execution order.
-
Fix actor component created post-beginplay that were getting added to the replicated subobject list despite IsReplicated being false
-
Fixed an issue where replicated object pointers to subobjects that are net-addressable/stably-named may not replicate or map properly. Controlled by cvar net.RemapStableSubobjects.
-
ChildActorComponent: Fix simulated actors using the wrong template to spawn the actor if the CAC template instance is of the wrong type.
-
Fixed replication of object references in UNetworkPhysicsComponent's rewind data.
-
Iris: Properly manage partially resolved refererences to only include them in applied state when they are resolved.
-
Fixed shutdown crash in FNetGuidCache and FObjectReferenceCache
-
Fixed a bug in Replication Graph where an actor having its dormancy state set to awake may have been treated as always net relevant unintentionally.
-
Iris: Fixed issue where subobjects of objects pending dormant all would not always be polled as they should
-
Network insights: Fixed aggregate display in PacketView
-
Iris: Fixed BitStream corruptions due to sending unexpected data to not yet confirmed objects - Fixed issue where PendingFlush would not properly flush attachments if posted on the same frame as the object was destroyed if it was waiting for creation confirmation.
-
Iris: Fixed ensure when client destroys actor marked as bNetTemporary.
-
ReplicationGraph: Ensure when an actor is replicated with bNetTemporary set
-
NetDriver: Fix for Push Model may prevent actors from going dormant * Now testing changelist history in CanSkipUpdate
-
Iris: Fix issue where state changes accrued while going out of scope and later readded to scope was not dirtied correctly
-
Fixed an issue in Replication Graph when Net.RepGraph.DormantDynamicActorsDestruction is enabled where dormant actors may fail to replicate correctly if they have dormancy flushed while a client is outside of their network relevancy range.
-
Iris: Added code to trap cases where we call EndReplication from client code where it shouldnt be called - Fixed issue with client calling EndReplication on components when it should not.
-
SubObject Replication: Make sure new subobject bunches are always reliable even if the subobject created an object replicator earlier than expected. PR #9850: Fixed an issue where Object requested an unreliable RPC before the ObjectReplicator was sent for the first time
-
Iris: Fixed floating point precistoin bug with really high priorities which caused issues with scheduling of dependent objects
-
Fixed a bug in network replays/the DemoNetDriver where if a recording time limit was set via the SetMaxDesiredRecordTimeMS function, some actor destruction wouldn't be properly recorded in the replay.
-
Fixed issue where FNetBitArray::FindLastZero would return index out of bounds for array sizes not aligned with the size of the storage.
-
Fixed an issue where replicated fast arrays in replicated subobjects may get redundant change notifications when flushing dormancy. Controlled by cvars net.EnableFlushDormantSubObjects and net.EnableFlushDormantSubObjectsCheckConditions.
-
Iris - Added explicit configuration of splitsizes for unreliable attachments from server and client - Fix issue with old moves being delivered from client if split and packet dropped.
-
Fix an issue in multiplayer PIE where some actors in world partition levels wouldn't replicate properly.
-
Iris: Changed Iris FastArraySerializer implementation to not rely on ItemMap when issueing FastArraySerialzierCallbacks as the itemmap was reset from callbacks
-
Ensure that DormantConnections and RecentlyDormantConnections are cleared for seamlessly travelling Actors, to prevent issues with replicating dormant actors that were persisted through a seamless travel
-
Iris: Fixed issue with posting rpcs to out of scope subobjects being scheduled with internal index and transmitted with invalid object.
Content Samples
New:
-
Archvis template has an updated GPU Lightmass map
-
Archvis SunSky Reverted Indirect lighting intensity setting from 2 to default 1
Level Design and Art Tools
Bug Fix:
-
Fixed an issue with the mesh painting tools loosing its texture override on an material intstance when an static permutation is enbabled.
-
Fix Pilot Actor not creating a transaction.
Geometry Core
New:
-
Updated TQuaternion::EpsilonEqual to recognize that the negative of a quaternion is also equal, and added an IsIdentity() method.
-
FDynamicMesh: add a CanCollapseEdge function to check if an edge collapse might fail before actually trying it
-
Exposed a new property bIsEditable on UDynamicMeshComponent to allow them to block any modifications done through EditMesh/SetMesh. Additionally, when this flag is set to false, the UDynamicMeshToolTarget is blocked from being created for the dynamic mesh component so modeling tools can't edit the mesh either.
-
The Convex Decomposition merge algorithm now supports callbacks to optionally track or prevent merges, allowing the algorithm to be used with more fine-grained control, and in new contexts.
-
Added a new polygon-based simplification method to ConvexHull3, and a tolerance for the initial hull build, to support use cases where we do not need an exact hull and can prioritize using fewer plane + avoiding near-degenerate planes in the output. This simplification is especially effective for cases where a large number of near-coplanar faces would exist in the exact-hull output.
-
Added cbrt (cube root) function to mathutil
-
Added support for inverting Transform Sequences, appending inverses of transforms to Transform Sequences, and for testing if a TTransformSRT3 can represent its own inverse (to help efficiently represent Transform Sequence inverses)
-
Added a static helper to the convex hull class to compute the convex hull volume for an array of points
-
Added a normal-based clustering algorithm, which groups connected triangle groups based on the current average normal of the group.
Bug Fix:
-
Fixed an issue where the convex decomposition proximity graph could be incorrectly generated, leading to suboptimal results.
-
Improved robustness of the edge bevel operation
-
Fixed a race condition in the sparse dynamic point octree sampling method, which could cause a crash in the ComputePoissonSampling method
-
Fixed Polygon2::Simplify's handling of case when initial close-point-removal reduces polygon to two points
-
Fixed crash in convex hull generation when tolerance-based point discarding is enabled.
-
Fixed a bug where polygon offsetting could crash or use excessive points when the output is an ellipse.
-
Fixed an issue where the mesh simplification and remeshing code could skip considering some edges for simplification/remeshing.
-
Fixed an issue where the convex decomposition algorithm could fail to respect requested negative space in some cases
-
Added the option to StaticMeshOperations::TransformMesh to correctly transform the normals and tangents. Default to the current behavior, which instead matches UE renderer. Add comments explaining both paths.
-
Made the MergeCoincidentMeshEdges operation not ensure on inputs with near-zero bounding box size
-
Improved robustness of the FGeomTools2D::TriangulatePoly method, making it more likely to successfully create a triangulation
Deprecated:
- Removed the deprecated FTransformSRT3's Inverse and legacy ExactPredicates methods from GeometryCore
Geometry Script
New:
-
Added a geometry script function to transform simple collision shapes.
-
Updated the display names of Geometry Script methods for setting per vertex normals, to clarify which computes new normals and which copies them from an input list.
-
Added a 3D polygon triangulation Geometry Script method, using ear clipping.
-
New DynamicMeshComponents now default to using externally-provided tangents, and have UI-exposed settings to change how their tangents are determined.
-
Geometry Script's CopyMeshFromComponent method can now optionally read instance colors from Static Mesh RenderData LODs.
-
Added a new method for Geometry Script to approximate convex hulls with spheres or boxes, if the shape is similar enough.
-
Added new geometry script functions to copy and transfer simple collision shapes from dynamic and static mesh components
-
Added additional spline->polypath conversion functions to support converting subsections of splines within a specified time or distance range, and to also get distance values associated with each point.
-
Added support for Geometry Script to convert Geometry Collections to Dynamic Meshes, via the CopyMeshFromComponent method
-
Added new point set functions to Geometry Script, including methods for for k-means clustering, computing bounding boxes, and converting between arrays of transforms vs arrays of points
-
Added a level set option to the geometry script 'Collision From Mesh' method
-
Added Geometry Script methods for directly manipulating sphere coverings, which can be used to control convex decomposition and convex hull merging algorithms.
-
Added a MergeSimpleCollisionShapes function to Geometry Script, which can reduce the number of simple collision shapes by merging them. This works via convex hull merging, so merged shapes will always be convex hulls, but shapes that are not merged will be left with their original type.
-
Added an 'AppendSimpleCollisionShapes' Geometry Script function, which constructs mesh representations of simple collision shapes
-
Added new properties to control the sample range for the Geometry Script spline->polypath and spline->transform array functions
-
Added support for a min thickness parameter in Geometry Script collision shape merging
-
Dynamic Mesh Component's complex collision mesh now supports physics materials
-
Added convex hull simplification to the geometry script collision functions
-
Added support for generating and visualizing sets of spheres that define important negative space around a shape, and for generating collision shapes which do not overlap those spheres.
-
Geometry Script methods to set collision on static mesh can now control whether the static mesh collision is marked as customized. This is useful for example to distinguish manually-modified collision from collision that was set by Geometry Script as part of an import pipeline.
-
Dynamic Mesh Component can now show collision in the editor view
-
We now optionally allow empty results for Geometry Script mesh Boolean operations
-
Added a Geometry Script function to combine simple collision shapes, by adding the shapes from the second to the first.
-
Added more point set functions for Geometry Script: 1. OffsetTransforms to offset the location of all transforms in an array, e.g. to move them all along their local Z if you want to move mesh samples along their normal 2. DownsamplePoints to downsample points to a fixed number of samples, optionally with priority weighting and approximate uniform spacing
-
Added a DetermineMeshOcclusion method to detect mesh instances that are fully occluded in a scene.
-
Added a method to remove unused vertices from a dynamic mesh
Bug Fix:
- Fixed a crash on appending to an empty polygon list
- Made the polygon path offset functions properly update their success flag output, and respect the 'copy input on failure' setting.
-
Made Geometry Script's methods to copy from/to static mesh properly respect the static mesh build scale.
-
Fix geometry script's ray plane intersection function
-
Made USplineComponent's public, recursive spline sampling functions work correctly for arbitrary curve ranges; previously they only sampled the spline accurately for short ranges (half a spline segment).
-
Guarded against the runtime StaticMesh -> DynamicMesh conversion functions crashing when CPU access to render data is not available; they should now instead ensure with a message explaining that CPU access is required
- The Geometry Script 'Recompute Normals' method now logs a warning if it is called on a mesh with no attributes or no overlay normals, and defaults to a per-vertex overlay in that case.
Modeling Tools
New:
-
Made the modeling mode physics inspector automatically update its visualization when collisions are updated by external actions
-
Selectable mesh elements are now highlighted when Mesh Element Selection is enabled.
-
Added Bridge action to TriEdit.
-
Level Sets can now be more accurately visualized by the modeling tools, using their surface instead of a grid of cubes.
-
Changed: Changed Tool Presets flyout dialog in the New Preset window to use a list presentation instead of a tile presentation, allowing for more clarity in reading names on long preset collection labels.
-
Added the option for the Mesh Inspector to draw edges without depth testing, so it is easier to see all the holes or other potential issues in a mesh
- BakeVertex improvements to per channel bakes
- BakeVertex per channel bakes will now only write over the specified channels.
- BakeVertex can now specify One/Zero evaluators for per channel bakes to flood a channel with the respective value.
-
Added an offset parameter to the Spline Tool, to support drawing splines that are not directly on the clicked surfaces
-
Added support for deleting polygroup edges.
-
Added collision shape merging to the 'mesh to collision' tool
-
Made the Mesh to Collision tool support its Min Thickness option for more collision shape types, and disable the option when it is not supported.
-
Added new space protection settings to the Mesh to Collision tool's convex decomposition method.
-
Added an 'At Origin' option for the desired Target Position in the Add Primitive Tool
-
Add a method for IModelingModeToolExtensions to provide tool target factories so that plugins can extend the interface with new ToolTargets.
-
The Mesh to Collision and Inspect Collision tools can now optionally show solid renderings of the collision shapes, in addition to wireframes.
-
Remesher: add an optional edge length scale function that can be used for adaptive-density remeshing
-
Made the Convert tool support a larger range of scene component sources, including Geometry Collection.
-
PDI thick line rendering now uses fewer triangles per line and is faster, improving responsiveness of preview wireframe rendering for some tools
-
Made modeling mode tools that do not affect selection auto-restore the previous selection after use.
-
Add support for copying simple collision shapes in more tools, including Merge, Boolean, and some Voxel tools.
-
Scene snapping now works in the DrawPolygonTool when the mouse is not hovering over the tool plane. This allows the user to be positioned between the tool plane and the objects being snapped to in the scene.
-
Adds 'Local Frame Mode' toggle in the Mesh Element Selection Toolbar Settings so users can edit with the gizmo frame based either on the selected geometry only or on the entire object
- The ScriptableTools plug-in is now moved from Experimental to Beta.
Bug Fix:
-
Fixed confusing comment leaking into editor tooltips for Y axis of FVector/FVector4/FQuat properties
-
Fixed undo for the AutoLOD tool when modifying an existing static mesh.
-
Improved Mesh to Collision tool capsule auto-detection, to prevent cones and cylinders-with-open-ends from being detected as capsules
-
Changed the hotkey for 'Lock Rotation' from 'Q' to 'Ctrl+R' in Polygroup Edit, allowing the 'Q' hotkey to enable selection as expected
-
Updated LOD Manager's preview of nanite triangle percent to the newer/more-prominent Keep Triangle Percent
-
Fixed an issue where that caused the mouse to spuriously jump to origin in some cases when modifier keys were pressed
-
The Static Mesh Editor now properly handles level sets in the same way as other simple collision shape types.
-
GroomToMesh tool: update the default value for RadiusScale to account for hair radii values no longer being normalized
-
The Simple Collision Editor tool now only run on targets that support writing collision. This fixes an issue where it would previously appear to allow editing the auto-generated collision for volumes, but discard the result.
-
Fixed an issue where the primitive tools (Add Box, Sphere, etc) could place the primitive behind the camera in some cases.
-
Fixed an issue where the Generate PolyGroups algorithm would randomly create very large, oddly-shaped regions in cases where the settings would normally generate many single-triangle regions.
-
Made the modeling tools correctly handle static mesh build scale.
-
Fixed the 'mesh to collision' tool not properly updating dynamic mesh component collision settings
-
Fixed the coordinate frame used when applying scaling in the Lattice tool
-
Fixed undo for simple collision shape updates for Dynamic Mesh components in some modeling tools
-
Fixed an issue with the Mesh Splines tool where best fit planes for separate splines would all still use the same plane origin, so adjusting one spline could affect the triangulation of another.
-
Scene snapping used when placing new primitives in the modeling tools now filters shape components in the same way as volumes, so that e.g. a trigger box is filtered (or not) in the same way as a trigger volume.
-
Fixed an ensure in the PolyEdit's tool's edge loop selection
-
Fixed a crash in the Draw Spline tool if an unusable blueprint class is requested.
-
Fixed a crash on interacting with sockets in the static mesh editor when the sockets window was not open.
-
Fix an issue where cancelled mouse-drag actions would be incorrectly handled as successful mouse-drag actions for some modeling tools.
-
The Mesh to Collision tool now respects the weld edges setting, instead of always welding mesh edges.
-
Fixed an issue where the Boolean and Merge tools would set updated materials on the asset but not the component, and so could show incorrect materials on an updated actor.
-
Fixed an issue that could occur in dynamic sculpting and other tools on an undo in the middle of a click-drag action.
-
Fixed an issue where some edges and vertices could not be moved with the mesh element selection system
-
Geometry Tools: Mesh LOD Toolset - fix bug in LODManager that could leave the mesh hidden after deleting the highres mesh. Also made sure the displayed information was correctly updated after undo in the tool
-
Improved gizmo placement for polygroup edges that form closed loops.
-
Made the Mesh to Collision tool's box auto-detection more robust, so it no longer detects staircases as boxes.
-
Added a filter to skip degenerate triangles when converting a mesh to a volume, so volumes created by the modeling tools are more often valid. This fixes collision for the modeling mode cone and arrow primitives when they are created as blocking volumes.
-
Fixed a bug which previously did not allow PolyGroup preview to be displayed in the viewport when using the Generate PolyGroups Tool
-
Fixed an issue where the initial preview of the merge mesh tool would appear in the incorrect location.
-
Fixed a bug with 'Clean Materials' in the LOD Manager Tool which was removing the incorrect material
-
For Mesh to Collision tool, improve auto-detection of spheres, so that e.g. low-poly cone shapes are not recognized as spheres.
-
Changed display name for Draw Spline's 'World' mode to 'World Objects' to try to make it clearer that it's raycasting to objects in the world
-
Fixed an issue where some of the modeling mode collision tools handled non-uniform actor scale incorrectly.
-
Fixed an ensure on trying to place a new modeling tools primitive mesh in a level when a volume is in the level and volume snapping is enabled
-
Fixed an issue the Simple Collision Editor and Mesh To Collision tools would not correctly undo for Dynamic Mesh components.
-
Changed LOD manager's "Show Seams" option to "Show Borders" and disabled it when the default LOD is showing
-
Fixed an issue where the Collision to Mesh tool would set incorrect transforms on simple collision shapes when Output Separate Meshes was enabled.
-
The Bake Transform and Edit Pivot tools no longer create two transactions when editing meshes with convex collision shapes, as the bug that required this workaround has been fixed.
-
Fixed a crash in the Draw Spline tool when the referenced blueprint is recompiled while the tool is in use.
-
Fixed an issue where vertex colors were used to render the modeling mode selection material.
-
Fixed a crash when inspect tool properties are modified after tool shutdown
-
Fixed an issue where the source mesh would be invisible if the Plane Cut tool was started with Show Preview unchecked
-
Made usability fixes to the Mesh to Collision tool: Added tooltips, removed the non-functional Simplify Polygon property, and made the Simplify Hulls toggle no longer affect the Swept Hull polygon.
-
Geometry Tools: TransfromUVs, fixing undo within the tool. GeometryFramework: Adding primary UVs to FVertexChange data.
-
Fixed a bug in the Mirror Tool which previously ignored scale transforms when writing to new objects
-
Bug Fix: Updated missing and incorrect icons for mesh selection mode.
-
When manually updating Brush Size in Group Paint Tool, the new size is now reflected in viewport immediately, without having to click in viewport to see updated size
-
Fixed an issue where non-uniform scaling of a selection in modeling mode could be incorrectly disabled or use the wrong coordinate frame.
-
Clamped Poly Edit's bevel distance ranges to avoid weird results for negative, zero, and very large bevel distances.
-
Preview mesh now properly updates when toggling Shells to Solids in the PolyEdit extrude activity.
-
Fixed an issue where some brush properties were shared across vertex painting tools that did not expose those properties in the UI, which could leave those tools stuck in an unexpected state.
-
Fixed an ensure in the Hole Fill tool for meshes complicated open boundaries
-
In the Mesh Element Selection Toolbar, when the Local Frame Mode is set to 'From Object,' the gizmo is now placed at the selected geometry's pivot, rather than the object's pivot
-
Made ctrl+click to position custom plane work more consistently in the Draw Spline tool
-
Fixed an ensure in the Auto UV tool when processing meshes with no colliding components.
-
Fixed an issue in the BakeTextures tool where MaterialID bakes resulted in gaps in the gutter pixels.
-
Fixed incorrect positioning of the extent gizmo in the pattern tool on undo/redo.
-
Fixed a crash in the AutoLOD tool when running on invalid StaticMesh assets.
-
Fixed an issue where the UV Layout tool would incorrectly continue to show a preview wireframe after the preview was toggled off.
Deprecated:
- Deprecated the FGenericMeshSelection struct, which is a now-unused part of a previous version of the modeling mode's selection system.
Procedural
API Change:
- AttributePartition and AttributeGenericPartition C++ API Extended in PCGMetadataPartitionCommon.h to support a TArrayView of selectors
-
Modified MetadataPartition node to support multiple partitioning of attributes
- The BP library for setting and getting graph parameters has been updated to receive a graph interface, which now includes both graphs and instances.
New:
-
Added support for Named Reroutes in the PCG Editor.
-
Added support for feedback loops where some results can be passed from one itheration to the next. Improved UI and pin properties to support this.
*Added a Get Loop Index node.
-
[PCG] Added a node that creates point data
-
[PCG] Nativation of CombinePoints Node, which combines each point to share a singular bound extent.
-
[PCG] Enabled Force Generation for PCG Component
-
[PCG] Nativized SplitPoint node, which splits each point into two separate points, and sets bounds based on the position and axis of the cut
-
Subgraph nodes now support recursion and will continue executing until there are no inputs left.
-
[PCG] Created a context menu which creates a subgraph node or loop node when dropping graph assets in graph
-
[PCG] Nativized DuplicatePoint node, which creates duplicates of each point with optional transform offsets.
-
[PCG] Add Replace Tag node for data tags
-
[PCG] Added a node that sorts points based on attribute
-
[PCG] Nativized DistanceToNeighbors node, now named Point Neighborhood
-
[PCG] Added a node that adds tags from the output pin to the next node.
-
[PCG] Added a node that creates points in a 2d or 3d grid
-
[PCG] Included support for partitioning (including CreatePoints)
-
Added new mode of generation for PCG Components called 'Runtime Generation', used for efficiently scheduling components for generation and cleanup based on proximity to 'Generation Sources' such as the player.
-
Added visual edge feedback when debugging (e.g. fat edges) and editor settings to control the appropriate values. Enabled inspection on reroutes and named reroutes.
-
[PCG] Nativized ApplyScaleToBounds and EditPointCenter blueprint nodes
-
[PCG] Added ApplyScaleToBounds which converts scale of a point into the bounds
-
[PCG] Added EditPointPivot - (renamed from ResetPointCenter)- which sets a new center point for the point, adjusting the bounds
-
Added PCGWaterInterop plugin with a 'Get Water Spline Data' node for getting 'Water Spline Components' in the level. Provides read-only access to Water Spline Metadata from PCG graphs.
-
[PCG] Added a node that applies a new random seed from point input using its position and user seed input.
-
[PCG] Create Sample Texture node, which samples the color of a texture at each point
-
[PCG] Added context menu to debug object tree, enabling jumping to a specific node/graph by right clicking the object in the debug tree
-
Added 'Preview' and 'Load-as-Preview' modes on the PCG component which allow changes on the component without dirtying while retaining ability to save pregenerated data and keep regeneration working.
-
Made the 'keep zero density points' option available in non-editor builds and non-transient where it makes sense (in data operations, not filtering elements)
-
Created new Visualize Attribute node, which currently prints an attribute's value to string with an offset for each point input
-
Added Runtime Quality Branch and Runtime Quality Select nodes. Added 'pcg.Quality' console variable ranging from 0 to 4 (Low, Medium, High, Epic, Cinematic).
-
Made the search recursive in the PCG Editor so we can easily find things in subgraphs as well
-
Added multiple details view and multiple attribute list views in PCG Editor with locking mechanisms.
-
Add actor property overrides to spawner nodes.
-
Added options to the get landscape data node to be able to retrieve physical material, component key, proxy touched.
-
Added support for compressed texture formats with PCG 'Get Texture Data' node.
-
Support Texture2DArrays in Texture Sampler
-
Added some flexibility around how we serialize and build the landscape cache (never, always, only on cook). Set on the Landscape Cache object on the PCG World actor.
-
[PCG] Reduced the cost of target calls, added ShouldComputeFullOutputDataCrc() for performance
-
Added a dependency only pin on the Gather node so that execution can be sequenced without requiring to filter data.
-
Added wire thickness settings in PCG editor.
-
Added a new Filter node, "Filter Data By Index", which will filter a data collection by user selected indices
-
Added 'Get PCG Component Data' node for getting generated graph outputs from other PCG Components in the level.
-
[PCG] Added support for CopyPoints node to allow multiple sources and targets
-
Add 'Apply On Actor' node. Applies property overrides and executes provided functions on a target actor.
-
Added native and blueprint element templated pins to the Proxy node
-
Add post-process functions on Spawner nodes ('Static Mesh Spawner', 'Spawn Actor', 'Create Target Actor', and 'Create Spline') that allow calling functions on the relevant target actor.
-
Added Attribute Set to Points and Points To Attribute Set nodes.
-
Updated the Volume Sampler to the new Time Slice Context
-
Added 'Number of Samples' mode to the 'Spline Sampler' node that samples a given number of evenly spaced points along the spline.
-
Add 'Create Surface From Spline' node for creating an implicit surface from a closed spline.
-
Created a new "Time Slice" context to make time-sliced node authoring simpler and consistent
-
Updated the Surface Sampler to the new context
-
Added Filter Data By Attribute node that verifies if data has some attribute or not. All filter data nodes now have both an in filter & out filter pins to allow easier manipulation.
-
Updated C++ API in PCGMetadataPartitionCommon.h to support partitioning on multiple attributes
-
Provide option on 'Spline Sampler' to have segment index as a metadata attribute. Provide boolean on 'Spline Sampler' to know if a point is a control point (Subdivision Mode only). Provide option on 'Spline Sampler' to have control point tangents as metadata attributes.
-
Added overriding properties in the Static Mesh Spawner when spawning By Attribute, which will partition points based on the overrides and create one ISM per customization.
-
Added match to nearest (& threshold distance) on the Match & Set.
-
Added a new Control Flow node, "Select (multi)" which operates on int, string, and enum values
-
Created a native PCG data asset class and an accompanying level-to-data-asset menu action. Replaces the editor utility blueprint that we had before. Also update the Alembic-to-PCG importer. #contrib 11380
-
Added Delete Tags node
-
Added "Sum" mode in the reduce node.
-
Added a new node called "Print String" which will emit a log/warning/error to the log, and optionally the graph and screen as well.
-
Refactored Graph Parameters to operate with PCG Graphs directly
-
PCG Biome Core experimental plugin added. The Biome Core is a data-driven PCG biome creation tool example. #virtualized
-
Added a Color Projection Mode to the Projection Element to include Source, Target, and common Blend modes (Add, Subtract, Multiply)
-
Added option to get both the single point and the data from the generation at the same time on the Get Actor Data node.
-
Replaced C++ API PCGPointProcessingElement with new PCGPointOperationElement to simplify authoring point operation elements and benefitting from Time Slicing.
- Four new dynamic events are now available to bind to on the PCG Component
- OnPCGGraphStartGenerating
- OnPCGGraphCancelled
- OnPCGGraphGenerated
- OnPCGGraphCleaned
-
Add double-clicking rows in the 'Debug Object Tree View' to auto-expand and select the first entry as the debug object.
-
Added the Proxy node that can execute other nodes (including dynamically selected values). Update the Load Data Table to allow outputting an Attribute Set Table instead. Added the Get Attribute Set By Index akin to the Point version.
-
Add editor command to rename nodes in PCG Graphs. Hit 'F2' or right-click the node and select 'Rename'. Double clicking node title no longer begins editing the title for nodes in PCG Graphs.
-
Added iterative relative transformation in the DuplicatePoint node.
-
Added the Match And Set node that allows to copy all attributes from a given Attribute Set Table entry when there is a match against a given attribute (similar to a join). Also supports additional selection by weight.
-
Add EPCGTextureFilter for Point and Bilinear filtering on 'Get Texture Data' node.
-
Add option to compute alpha and distance along curve as attributes in PCGSplineSampler. Alpha is a value in [0,1] along the curve where each segment of the curve represents the same interval. For example, if the curve has three segments, points on those segments would lie in [0,0.333], [0.333, 0.666], [0.666, 1] respectively, and interpolate across those intervals using the spline's interpolation. Distance is the total cumulative distance along the spline to reach a given sample point
-
Added support for actor post-process functions that take Point + Metadata as parameters on the 'Spawn Actor' node.
-
Added merge attribute set node
-
Provide flag 'bForceEditorOnlyCPUSampling' on 'Get Texture Data' node to force creation of a CPU-accessible duplicate of the texture. Avoids GPU compression artifacts and allows for more accurate sampling.
-
Updated the Attribute (metadata) operations to support multiple inputs in cases where it would make sense. Now accepts N:1, N:N operations on input pins.
-
Support sampling textures marked as 'CPU-accessible' in PCG Texture Data.
-
Added ability to copy all attributes in the Copy Attribute node.
-
Replaced the Intersection node with a new Intersection node, which supports dynamic source inputs. Primary inputs will be iterated on and secondary inputs will be implicitly merged. The previous Intersection still exists, but has been renamed "Inner Intersection"
-
Added some abnormal state logging that will iterate over everything from the PCG menu.
-
Added a new Control Flow node, "Switch", which operates on int, string, and enum values
-
Added the option to tag some graphs as editor-only to prevent some data validation issues. This is a transitive property (through subgraphs) and is propagated to PCG components as well.
- Added mode to spawn actors selected by attribute in the Spawn Actor node.
Bug Fix:
-
Fixed culling in CreatePoints and CreatePointsGrid nodes where it wasn't working properly for local components.
-
Fixed a bug where in the Static Mesh Spawner, the ISM Body Instance Customization was displaying default channels after reloading the Editor
-
[PCG] Fixed issue with AddTags node outputting overrides
-
Fixed profiling issues that were corrupting profiling data (in the PCG Profiling window) especially in loops & dynamic subgraphs.
-
Subgraph nodes with no selected subgraph (& no dynamic graph provided) now act as passthrough nodes.
-
Fixed a bug causing the Volume Sampler to sample the last column in X, Y, Z incorrectly
-
Two console variables 'pcg.CheckSamplerMemory' and 'pcg.SamplerMemoryThreshold' have been added to help alleviate an Out of Memory crash when unintentionally sampling too many points.
-
[PCG] All native nodes now forward tags
-
[PCG] Fixed issue where multiple debug object tree objects could be selected
-
Fixed a bug where the PCG Volume did not properly follow surface normals in the Editor.
-
Improved support of PCG inside of level instances.
-
PCG static mesh spawner now respects the ISM component type decision and applies a change only in HISM+Nanite cases
-
Bug Fix: [PCG] Fixed attribute selectors that were not overridable
Deprecated:
- Removed the per-node tag filtering and tagging as this was marked deprecated already in previous versions.
- Nodes that were using the Add Tags On Output and had downstream nodes will have new nodes adding tags added automatically. Removed the 'remove duplicates' option on the debug settings since it served no real purpose and was transient.
- Removed deprecated pins by default on input node. Existing pins will continue working and feed in the data the right way but future work should use the appropriate Get...Data nodes.
UV Editor
New:
- Added a new UV Editor tool, Texel Density, which supports manipulations of texel density for UV Islands. The new tool supports a sampling mode, to read and apply texel density from one region of a mesh to other regions or meshes.
Bug Fix:
-
Added missing localization text for Transform Tool's property categories.
-
Fixed issue where unwrap material was set with a depth offset multiplier that rendered mesh lines difficult to see in the unwrap view of the editor.
World Building
New:
- Branch culling to avoid executing inactive nodes downstream of Branch and Switch nodes.
- Required pins added to native nodes which must be wired for node to be compiled and executed.
- Requiewd Unified visualization of culled state in editor (covering both compilation-time and execution-time culling).
- CanCullTaskIfUnwired added to node settings API to always execute some nodes, even if unwired.
-
PCG - first pass of world builder added to generate PCG components in a level.
-
Display grid size label on nodes when inspecting hierarchical generation.
-
World Partition Editor QoL Make sure we can only play with the Loaded Regions & related streaming features when the streaming is enabled. Hide the loaded regions when we toggle the Streaming enable so we keep them. When converting a Loaded Region to LocationVolume, make sure we have an incremental label for the user. Make sure the scaling gizmo would be intuitive on the Location Volume (after converting a loaded region) by scaling the brush instead of the actor. Fixed : Converting a loaded region into an asset does not count as a transaction on the undo history, but deleting it from the viewport or the outliner does.
-
Greatly optimized FActorFolders in PIE (now has no impact of PIE performance) - Outliner automatically hides empty folders in PIE
-
InstancedStaticMesh Serialization Optim+Fix when bEditableWhenInherited == false (PackedLevelActors) - Avoid persisting PerInstanceSMData, PerInstanceSMCustomData in this case and copy values from Archetype - Also assign NumCustomDataFloats from Archetype in this case to fix warning (issue was with PerInstanceSMCustomData being always serialized and NumCustomDataFloats being delta serialized causing warnings before ReRunConstructionScript got to run)
-
PCG Replace "Can Be Multithreaded" option on PCG Blueprint nodes with clearer "Requires Game Thread"
-
PCG - multi-line node titles supported with sub-lines giving task information
-
WorldPartition: Added Blueprint function UDataLayerManager::GetDataLayerInstances and exposed to BP UDataLayerInstance GetDataLayerShortName, GetDataLayerFullName and GetAsset.
-
Allow Get Actor Data to trigger generation when querying data from Preview components that are not already generated.
-
Added builder support for generating Preview components.
-
PCG - Add Make Concrete conversion type for wiring to Concrete pins, performs a collapse of non-concrete Spatial data.
-
World Partition: Expose Per User Settings into Editor Preferences (under World Partition (Local) section)
-
PCG- Added new Get Bounds node to compute bounds of input Spatial data
-
World Partition Editor: Add option (slider) to play with the unloaded region opacity (default is now ~10% brighter). Tweak clamp between good values with the rest of the features such as highligting regions, loaded regions. Value is saved in PerProjectUserSettings.
-
Avoid unnecessary graph executions when switching between debug objects one component
-
World Partition * Add an editor preference to log the generate streaming in PIE (default true).
-
Modified WorldGridPreviewMaterial to preview streaming with both 2d and 3d components when using the new Runtime Hash. - Added a hatched grid pattern to display 2D cells within 2D range - Replaced the 3d streaming spherical radius display with 2D circle instead - Full semi-opaque cells without the hatched pattern represents the actual 3D loaded cells using the spherical test. #changelist validated
-
Remove debug object dropdown from PCG graph editor, functionality replaced with Debug Object Tree window
-
PCG - Added warning/error status icons to Debug Object Tree with summary tooltip
-
World Partition Editor Hide Options menu when no option are available (mostly for UEFN). Use UToolMenu for the Contextual Menu. This way Licensees and FN could extend it. Re-org the Contextual options for clarity. * Make Load From Here a user create region to be consistent with the editor and remove No loaded region tip.
-
ReplaceActors: Selection optimization (costing > 40seconds for about 500 selected actors). Avoid notifying for every selection change since it is already inside a batch operation.
-
Add an option to place actors under a subfolder instead of the root when breaking a Level Instance. If this option is enabled, the actors will be placed inside the folder the LI is inside of, under a subfolder with the name of the Level Instance, and also keeping their original folder structure. So if i.e. the Level Instance Actor is called "Desert/LI_House2", and an actor inside is named "Lights/Light_Sun", the actor will be moved to "Desert/LI_House2/Lights/Light_Sun" in the outer level.
-
UDataLayerEditorSubsystem now exposes to Blueprint functions to Add/Remove Data Layers to the Actor Editor Context.
-
PCG - Add actor volume output to grid size node, and add Cull Points Outside Actor Bounds node, for convenient culling of data outside of the current grid cell.
-
Sanitize attribute names when creating from component/actor tags. Replaces invalid characters with underscores.
-
[PCG] Avoid unnecessary graph re-executions when trivial changes are made to a graph such as adding a new unwired node which will be culled during compilation.
-
External Data Layer V1 - Allows for plugins to inject/remove content (actors) in a partitioned world - Serves as a replacement for the experimental 'Content Bundle' feature - Added new External Data Layer (EDL) Asset - Added new Game Feature Action 'AddWorldPartitionContent' to control activation of an EDL asset - Supports Data Layers inside a plugin (child of an EDL) - Added builder to convert content bundles to EDL (UGameFeatureActionConvertContentBundleWorldPartitionBuilder) - Feature is temporarily disabled by default and can be turned on using Editor Experimental Settings 'Enable World Partition External Data Layers' flag
-
Packed Level Actor: Avoid updating blueprints if packing result is unchanged
-
Exposed UDataLayerLoadingPolicy and FWorldPartitionActorViewProxy to plugins via ENGINE_API
-
PCG - when inspecting a node, debug objects for which this node produced output data are highlighted in the Debug Object Tree.
-
PCG - Projection node defaults to automatically collapsing point projections to point output data.
-
[SceneOutliner] Using Load and Unload selected volumes context menu options for LocationVolume in the Outliner does not grey out these options.
-
[PCG] Disable warnings on grid size nodes if higen disabled or if component is not partitioned, so that graphs are portable across different execution setups.
-
Finer-grained change propagation during graph execution - CRC computed per node output pin rather than for the whole output data collection.
-
Get Actor Data element (and other typed getters) default to performing a full data CRC on point data which can also avoid unnecessary re-execution.
-
Implemented dormancy for AWorldDataLayers which reduces actor replication to the minimum (i.e. replicates only when necessary).
-
WorldPartition: Added option in WorldDataLayers actor to save each DataLayerInstances in their own file (disabled by default)
-
PCG - Disable Hierarchical Generation when a graph is executed as a subgraph, to avoid conflicts in grid level designations between this graph and the parent graph.
- World Partition Editor Upgrade overall UX (new icons, new menus, new toolbar, new layout) Now possible for licensees to extent options in our menus. * Add same LevelViewport actions in the WP Editor (Build Hlods, build minimap, etc.) via new Build menu.
Bug Fix:
-
Refactored UWorldPartitionLevelStreamingDynamic to go through ULevel::CleanupLevel for trashing packages and clearing standalone flag.
-
PR #10872: Fix crash in data layer editor when streaming-out a partitioned level with runtime data layers #contrib 10872
-
PR #10609: Nullify World->ContentBundleManager if World Partition is disabled. * Could happens when switching from non WP world to WP world. #contrib 10609
-
Fixed ULevelStreamingLevelInstance::LoadInstance to properly handle a streaming level load while the underlying streaming level already exists but has not executed/completed. Added bAllowReuseExitingLevelStreaming to FLoadLevelInstanceParams to allow reusing an existing streaming level (defaulted to false).
-
FAsyncPackage and FAsyncLoadingThread2 CallCompletionCallbacks now properly sets GPlayInEditorID with associated package request PIEInstanceID using FPlayInEditorLoadingScope.
-
Fixed UWorldPartitionLevelStreamingDynamic::RequestLevel which didn't properly handle requesting a WorldAsset already requeted by another streaming level in the world (affects PIE). Refactored ULevelStreaming to share code with child classes.
-
LevelInstanceSubystem: Handle OnCleanupWorld to properly cleanup currently loaded LevelInstances as CleanupWorld doesn't do proper streaming out of levels Reported through UDN : This is an issue with UWorld::ReInitWorld() (which is called on "Rebuild All"), it calls CleanupWorld / InitWorld which was leaving the LevelInstances in a bad state.
-
Fixed the server not respecting the runtime Data Layers logic operator.
-
ApplyCVars Fix: Move Effective values from globals (which could change between cook and runtime) to per SpatialHash values that are initialized only when GenerateStreaming is called This also fixes ApplyCVars being called mulitple times in PIE when using Level Instances which could lead to different results if Level Instances were using different settings than main world
-
Choose File To Save: Fix issue where Saving a map would save it's dirty actors even if they werent selected by the user
-
Fixed regression in APlayerController::ClientFlushLevelStreaming_Implementation introduced by 1730015 (inverted logic). ClientFlushLevelStreaming was not flusing which was causing replication issues when a client joins a server which previously streamed sublevels.
-
Fixed PIE crash when client tries to connect to the server: loaded world package PIEInstanceID was not set and package name had no preflix UEDPIE. This change is basically a revert of an old CL 1810531, which doesn't really go into the details on the change outside of mentioning that it's was a temp fix. Loading a PIE World without its package PIEInstanceID nor properly fixing up for PIE is not a supported code path.
-
PCG - Fix bug where projected splines do not work when fed to a Difference node.
-
Fixed world partition streaming generation not properly handling dirty actors of a newly created level based on a template partition map.
-
WorldPartition Server streaming : Make sure the server streaming always loads a bit more than the client. This is necessary to avoid making the client wait indefinitly for the server to finish loading cells that are not even requested by the server because of a slight difference between client and server streaming source locations. Network quantization and world partition location/rotation quantization can contribute to this difference. - Added wp.Runtime.ServerStreamingSourceMinimumExtraRadius to control the minimum extra radius applied on server streaming sources. - Added wp.Runtime.ServerStreamingSourceMinimumExtraAngle to control the minimum extra angle applied on server streaming source shapes.
-
Fixed cooking indeterminism caused by code assuming that IAssetRegistry::GetAssets returns a deterministic ordered list (which is not true).
-
WorldPartition: wp.Runtime.UpdateStreamingStateTimeLimit is now ignored if world is HighPriorityLoading or is in SeamlessTravel or if is inside a BlockTillLevelStreamingCompleted or if match hasn't started.
-
Fix crash when wiring nodes.
-
Added virtual UWorldPartitionRuntimeCell::ShouldServerWaitForClientLevelVisibility which can be overriden to allow for a server cell to ignore client level visibility before unloading the cell. - WorldPartitionStreamingPolicy keeps UPROPERTY references for activated/loaded cells to avoid any deinjected cells to be GC'ed. - Deprecated IsAddedToWorld and CanAddToWorld in UWorldPartitionRuntimeCell as they are no longer used - Removed unused SortedAddToWorldCells in UWorldPartitionStreamingPolicy
-
Fix some data CRC issues where graph was not re-executed correctly when an attribute name is changed.
-
Delete Actor: Avoid warning about Soft/Hard references if that reference is also being deleted
-
Defer FWorldPartitionRuntimeSpatialHashGridPreviewer material initialization (loading) to avoid calling LoadObject during async load.
-
Fixed removal of leaf data layer instance (when using data layer parenting) that was not properly updating parent. Fixed removal of a data layer instance which could trigger an infinite loop when reparenting children of the removed data layer instance.
Online
New:
-
Added new plugin EOSOverlayInputProvider to forward input to the EOSSDK Overlay and stop transmitting input to the game when it is open.
-
Added bugfixes and missing logic to ensure Dedicated Server Sessions work in Lyra when using OSS EOS.
-
Add OnlineRequiresSecondLogin console variable to OSS Null for testing the use case of a system being offline when it is first launched
Bug Fix:
-
Fix Icmp ping posix implementation and enable it for iOS
-
OnlineBeaconClient now cleans up properly if the beacon's NetDriver is pending destruction.
Hotfix System
New:
- Added UCurveTable modification callback deferral in OnlineHotfixManager, significantly saving the number of callbacks if performing a large number of row updates.
HTTP
New:
-
Enable event loop by default on most of the platforms.
-
Add http request progress delegate 64 bit support.
-
Improve default HTTP retry behavior when services do not indicate how long to wait for retries - Retry period changed from linear to exponential; - Adds random jitter multiplication to computed backoff. Final default retry lockout period formula looks like this: RandRange(JitterMin, JitterMax) * Pow(Base, RetryNumber + 1 + Bias) where RetryNumber is 0, 1, 2, 3... Defaults: JitterMin = 0.5 JitterMax = 1.0 Base = 2.0 Bias = 1.0
-
Deperecate the FGenericPlatformHttp::UsesThreadedHttp interface and remove corresponding impls, now all platforms are using threaded http requests.
-
Deprecated HttpTimeout config, use HttpActivityTimeout or HttpTotalTimeout instead; Deprecated HttpReceiveTimeout and HttpSendTimeout config, only use HttpActivityTimeout; Made HttpActivityTimeout work on all platforms, not only CurlHttp.
-
Update RapidJson to latest code at commit 3f73eda.
-
Added http fail reason interface in http request and response, instead of using the status to check if it's connection failure or any other reason.
-
Make sure don't pass received data to stream interface after cancelling the http request or after shutdowning http module.
-
Switched to use thread-safe delegates for http requests.
-
Added the support to make http retry system don't rely on Tick from game thread.
-
Added status code received callback for early access before downloading request complete.
-
Add third party library RapidJSON_v1.1.0.
-
Removed the dependency of http request from http response; Make http requests use GET by default if verb is not set.
-
PR #10520: Fix issues with non blocking sockets in SocketBSD preventing http server from serving large files on linux
-
Extract the Response from http request implementions into HttpRequestCommon; Fix the issue the response in request is not cleared on some platforms when retrying.
-
Added GetEffectiveURL interface to get the effective url after redirection.
-
Changed default send/receive timeout(HttpActivityTimeout) to 30s.
-
Change the default connection timeout to 30s.
-
Made all http impls respect the connect timeout set in http module.
-
Added runtime args for enabling/disabling http event loop.
-
Fixed the potential HTTP dead lock when Flush while canceling request; Add the ProcessRequestUntilComplete sync call to IHttpRequest.
-
Added optional, separated retry limit support for connection error in http retry system.
Bug Fix:
-
Fix the issue on certain CPU, the http thread hang forever because of the incorrectly calculated elapsed time.
-
Fix dependency chain on "Chaos" plugin in WebTest to depend on "JSON" instead
-
Fixed a potential crash in http curl impl when destroy http requests.
-
Make sure to re-open the file when retry http request with streaming upload request.
Online Subsystem
New:
-
OnlineSubsystemEOS: Add "-EpicSandboxIdOverride" command line argument, which takes precedence over the "-EpicSandboxId" argument passed by Epic Games Launcher.
-
EOSShared: Add IEOSPlatformHandle::GetConfigName to expose the config used to create the platform instance. OnlineServicesEOS: Modify OnlineServicesEOS*::GetEOSPlatformHandle to return IEOSPlatformHandlePtr, so the config name etc is accessible.
-
Update the CreateSession BP node to include a "Use Lobbies If Available" boolean.
-
Add the ability to specify Steam OSS server names via config files
-
OnlineSubsystemEOS: Removed bShouldEnforceBeingLaunchedByEGS config variable. Licensees using this mechanism should migrate to using the "LauncherChecks" mechanism (see bUseLauncherChecks in TargetRules.cs)
-
Added logic to test OSS EOS Leaderboards Interface methods via console commands.
-
Updated Google SignIn implementation in OSSGoogle Android to use latest dependencies. Added silent sign in and support for offline access
-
OSSEOS - Added IUniqueNetIdEOSPlus interface, to expose getters for the underlying Base and EOS NetIds. Simply cast your EOSPlus FUniqueNetId to IUniqueNetIdEOSPlus. Note this is only safe if FUniqueNetId::GetType() returns "EOSPlus".
-
Added purchasing and store interfaces to Steam. Purchased apps connected to your main apps will now automatically show up as a receipt in the purchasing interface. For more complex microtransaction support, a new steam purchasing link has been added that allows you to maintain the same Online Subsystem interface purchasing flow as you do for your other platforms but interweave in the Steam-required server implementation for microtransactions.
-
Update GooglePlayBillingLibrary to v6.0.0
-
Full integration of EOSSDK 1.16.1 binaries, headers and libraries.
-
Update Steamworks SDK to 1.57 Expose Steam's GetAuthTicketForWebApi via IOnlineIdentity::GetLinkedAccountAuthToken
-
Update GoogleSigniIn SDK to 7.0.0 on iOS
-
OnlineServicesCommon - Add MakeExecHandler helpers
-
OnlineError OSSv2 logging changes- Fixed ToLogString discarding the prefix even if the option is set to true. The new format looks something like this- [1.1.5-3.1.17] NotImplemented (EOS_MissingInterface) ToLogString now logs the human readable ID instead of the binary ID (i.e. [1.1.5-3.1.17] instead of the binary representation of that)
-
Return the result of show login UI so game can distinguish between console login failure and cancellation.
-
EOSSDK - Delete NDA platform documentation, this is available on the EOS docs site now.
-
Lyra now has a simple sessions-based presence plugin that uploads data of the running session (or main menu status) to the online subsystem
-
Add some config vars for Steam OSS timeouts
-
Added built in support for SteamChat's rich presence keys and friend grouping keys
-
Added logic to prefer AccountPortal + PersistentAuth login when using OSS EOS on Switch with bUseEAS enabled Added logic to save, load and delete AccountPortal auth token and token expiration locally using ISaveGameSystem
-
Add EOS Integrated Platform support for Steam using the -CustomConfig=SteamEOS command line option. This also includes the SteamEOS option to enable this in Lyra, but full Steam integrated platform support in Lyra is still a WIP (Lyra does not support the adapter at the moment)
-
Add a fatal log message and message box when EOSSDK fails to be loaded. This is disabled by default, but can be enabled by setting the following config in Engine.ini hierarchy:
- [EOSSDK] bDllLoadFailureIsFatal=true
Bug Fix:
-
The -nosteam command line option now entirely prevents Steam modules from being loaded entirely
-
Changed how OSS EOS Sessions responds to a EOS_ELobbyMemberStatus::EOS_LMS_CLOSED notification, destroying the related lobby instead of just removing the lobby member.
-
Fixed an issue with the Friends interface in the Steam OSS not properly polling and retaining presence data.
-
Do not disable the sandbox in the Steam online subsystem because it causes async file operations to randomly fail
-
Added missing delegate trigger for OnPresenceReceived in UserManagerEOS
-
Fix crash in FOnlineSessionIOS::StartSession when creating sessions
-
Fix GetFriendPersonaName in Steam OSS to use 64-bit ID
-
OnlineSubsystemEOS: Fix FUserManagerEOS::QueryExternalIdMappings not correctly breaking up large queries into sub queries.
-
Fixed issue where the EOS overlay was disabled when WITH_EDITOR was true
-
Fixed an issue causing SteamSockets to fail to match session and connection IDs with the host
-
OnlineSubsystemEOS now logs into Steam via the Session ticket instead of the app ticket
-
Fixes for Steam's LeftLobby and IsMemberOfLobby, community contributed. Use a manual array search instead of built-in TArray functions since they behave incorrectly with shared refs
-
OnlineSubsystemEOS: Fix issue where Checkout was succeeding, but was failing to return a valid receipt.
-
Fix null ConnectHandle when registering EOS auth handlers
-
Addition of logic to transmit EOS Overlay session join as an OnSessionUserInviteAccepted delegate. Addition of support for OnSessionInviteReceived delegate.
Deprecated:
-
EOSSDK - Moved the "project binary" mechanism from GlobalDefinitions set on each .Target.cs, to config variables, so it is configured project wide in one place and does not need defining on every target in a project. The old GlobalDefinitions mechanism is maintained for backwards compatibility, but is deprecated and licensees should migrate.
-
[OnlineSubsystemEOS]:bUseSessionPresenceAttribute has been removed as a config option, along with the logic executed when it was set to false.
Pixel Streaming
New:
-
Added AV1 support to Pixel Streaming and AVCodecs
-
Added support for the Virtual Camera's "Pixel Streaming Output Provider" on Mac
-
Re-shipped Pixel Streaming Player that was non-functional in 5.3 and 5.2. The player now supports hardware accelerated decode where the hardware supports.
-
Added a Pixel Streaming Stats interface to enable you to graph your own Pixel Streaming related stats
-
Added support for Pixel Streaming on Mac. NOTE: This functionality is only available for M1 Macs and later. Intel based Macs are not supported.
-
Added editor notification when using Editor Pixel Streaming to inform the user that the plugin is going to disable the editor setting "Use Less CPU when in Background".
-
Added OnPlayerRequestsBitrate to the Signalling Observer interface. Allows the user to respond to custom bit rate requests.
-
Adding elevated checks so that certain data channel messages can be limited to specific users.This means that only the peer controller should be able to control things like resolution, bit rate etc.
-
Updated Pixel Streaming to use version 1.13.1 of libVpx and version 5414 of WebRTC
-
Added a pair of settings to specify a port range for WebRTC. You can specify a minimum port by launching your application with "-PixelStreamingWebRTCMinPort=xxx" (or using the "PixelStreaming.WebRTC.MinPort" console variable). Additionally, you can specify a maximum port by launching your application with "-PixelStreamingWebRTCMaxPort=xxx" (or using the "PixelStreaming.WebRTC.MaxPort" console variable).
-
Added the FPixelStreamingVideoSink class which allows you to extract decoded frames from a WebRTC stream
- Exposed three new PixelStreaming/WebRTC settings to mitigate frame drops in LAN scenarios.
- PixelStreamingWebRTCDisableFrameDropper=true, where true disables frame dropping inside UE's WebRTC.
- PixelStreamingWebRTCVideoPacingFactor=N, where N is a multiplier for how lenient we are on pacing large bitrates (e.g. a value of 100 is quite lenient).
-
PixelStreamingWebRTCVideoPacingMaxDelay=M, where M sets the max packet pacing delay (ms). The combination of these settings allows sending large fixed bitrates without frames being dropped on the UE side - this is useful for LAN streaming scenarios, but will cause stutters, lags, and congestion as packets are lost or unable to transmitted fast enough over the actual internet.
-
Allow the passing of a custom websocket to the signalling server connection
-
Allowing bit rates to be set on initial connection. The settings panel parameters from the front end should now apply properly when connecting.
-
Defaulted Pixel Streaming Player connection URL to port 80
- Improved websocket disconnect messages in the Pixel Streaming plugin. Previously all disconnects on the UE side were reported with no disconnect message.
Bug Fix:
-
Fixed the editor becoming locked if an editor stream was stopped from the browser
-
Fixed a memory leak in FVideoResourceCUDA that was affecting pixel streaming users on all platforms
-
Fixed small stream stutter when new players connected
-
Fixed Virtual Cameras not streaming on Windows when running with Vulkan
-
Fix crash when pixel streaming shutting down. The cause was the thread object (FrameThread) being destroyed while the thread was still running.
-
Fixed a frame skip issue in Pixel Streaming VCam that was caused by MediaIO capture being informed of an irrelevant resolution change.
-
Fixed a memory leak in TVideoEncoder
-
Fixed EditText button doesn't show when tapping an editable text widget
-
Fixed EditableText widgets not respecting ReadOnly property and being able to be edited by a pixel stream
-
Fixed data channel only streams being non-functional. A data channel only stream can now be started by launching an application with "-PixelStreamingWebRTCDisableTransmitVideo" and "-PixelStreamingWebRTCDisableTransmitAudio"
-
Fix peers not getting any frames when stream sharing without a quality controlling peer.
- Configure PixelStreaming VCam for lowest latency experience.
- Disable sending keyframes on an interval to have a smoother decoding/bitrate profile.
- Set a fixed video encoding bitrate ignoring WebRTC (as we know we are on LAN)
- Enable filler data during video encoding (while wasteful this ensure stable bitrate which helps with latency estimations)
- Disable the frame dropper so we can stream as very consistent FPS.
- Set video pacing factor to make more lenient to large bitrates
-
Fixed NVDEC hardware decoding being non-functional. This allows the Pixel Streaming Player to leverage hardware accelerated decoding with NVIDIA GPUs
-
Fixed Play In Editor (PIE) audio not being streamed when editor streaming
-
Fixed error log caused by passing wrong size texture into the MediaIO capture pipeline when doing VCam Pixel Streaming.
-
Fixed OnTextCommitted not being called when a text update is triggered by the LiveLink app
-
Improved end to end latency between Unreal Engine VCam Pixel Streaming and the LiveLinkVCam app by capturing frames using the UMediaCapture anythread mode. This greatly improves the consistency of the frame capture time and therefore allows for a much more stable (and less buffered) WebRTC video stream.
-
Unlocked 60fps streaming in LiveLink VCam app by configuring the default rendering rate of WebRTC's MetalKit video stream to be 60fps instead of 30fps.
- In VCam Pixel Streaming coupled render rate and stream rate for better frame synchronization (latency) between UE and the LiveLink app.
Deprecated:
- Deprecating kick player functionality. This behavior still works but is marked for removal in later versions.
Voice
Deprecated:
- Deprecate old IVoiceChat::Set3DPosition API, and add default no-op implementation - Add new simplified IVoiceChat::Set3DPosition API, and add default no-op implementation so third party implementations of IVoiceChat keep compiling.
Websockets
New:
- Added helper methods for retreiving URL parameters from websocket connections
XboxLive
Bug Fix:
- Fix a failure to join from invitation without session info.
XMPP
Bug Fix:
- Fix crash in libstrophe when a specially crafted xmpp message hits a codepath that only partially resets some internal state leading to a null pointer dereference
Platform
New:
-
Add warning on all critical sections about double unlock potentially causing deadlocks
-
First part of TargetPlatform(TP) refactor into TargetPlatformSettings(TPS) and TargetPlatformControls(TPC) TPS doesn't need SDK and will be used to get info about the platform TPC requires SDK AndroidTP has been converted to the new system
-
Added new PerPlatformConfig class flag indicating the config properties can be overridden in a Platform/PlatformEngine.ini file. When a class is marked PerPlatformConfig, in the editor the class will be loaded from the platform inis of the current PreviewPlatform on load, and when the PreviewPlatform is changed, LoadConfig will be called to reload the settings from the platform ini file.
-
Validate Cast at compile time - Casts between unrelated subclasses of UObject will produce a static warning (and an error when treat warning as error is true) - Trivial casts will be resolved at compile time without calling IsA<> This can be disabled with UE_ENABLE_UNRELATED_CAST_WARNINGS = 0
-
Bump windows version from 18362 to 19041 to meet the minimum spec for GameInput API
-
Cast, ExactCast and CastChecked with TObjectPtr are const correct
Bug Fix:
-
Disable passing
/Osand pass/Ob0when usingclang-clin debug builds by default since otherwise it interferes with debuggingclang-cl-generated executables in Visual Studio. -
Fixes our Clang database generation to produce a compilation database that doesn't trip up against our checks in platform headers, so that it can actually be used properly.
-
Fix bug in D3D12 RHI that could cause corruption of texture cube resources due to missing resource transitions, e.g. during mip downsample for reflection captures.
Desktop
New:
- Added SecuritySandbox experimental engine plugin which allows a game client to restrict its own access rights on Windows to better follow the principle of least privilege.
Linux
New:
-
Enable preliminary Linux support for sparse volume textures and OpenVDB
-
Refactor FGenericPlatformOutputDevices::SetupOutputDevices code just a little so that we don't have to suffer code rot in a custom linux implementation
Bug Fix:
-
BugFix: Fixed fix linux compile issue with include upper case lower case name.
-
Replaced use an incorrect use of sa_handler with sa_sigaction
-
Fix invalid directory separator in GeoReferencing plugin so that Linux properly packages it
-
Fix OpenColorIO build script for Linux
-
Implement GetPhysicalProcessorCount for Linux so that PGO builds can work properly
-
Reduce repeating monitor DPI log event spew to only print on the first occurrence
Mac
API Change:
- There is no behavioral change here, but it provides the option to change what it is and supports more platforms then just Mac.
New:
-
UBA: Add Mac Menubar App for UbaAgent
-
Add Mac support for showing additional content on the right side of the title bar.
-
Added support for Privacy Manifest handling for iOS and Mac
-
Move source files from editor xcode projects to game xcode projects
-
Apple: Update runtime to macos 11 and clean up warnings from doing that.
-
Switched to Apple's Metal CPP for Metal implementation
-
Improve source code lookup feature, using dsym if exists.
-
Move the macOS main menu into the editor window.
Bug Fix:
-
Fix Tools -> Open Xcode not working with modern Xcode
-
Use ProjectDisplayedTitle as AppName on Mac if set
-
Add a toggle for the behavior of EKeys::Platform_Delete on Mac. On a Mac keyboard pressing just "delete" will act as a "backspace" on windows or linux, and pressing "function+delete" will act as "delete" on windows or linux.
-
Fix archive fail when packaging a Blueprint only project for distribution
-
Fixing NavigateToFunctionSource crashes and errors.
-
Fix multiple controllers not supported on Mac
Online
API Change:
- Previous usage of DisplayName now use a sanitized version.
New:
-
[OnlineSubsystem] Implement a content restriction interface that supported platforms can leverage for age verification information
-
Added support for new EOSSDK 1.16.1 BestDisplayName methods to OnlineSubsystem and OnlineServices
-
EOSShared has added option to compile against targets without Engine dependencies
XR
API Change:
-
Improved the extensibility of the IOpenXRExtensionPlugin interface by adding new overrideable callbacks: OnSuggestBindings, OnCreateActionSet, PostCreateActionSet, OnCreateAction, PostCreateAction, and OnActionSetAttach.
-
It may be necessary to change from using FOpenXRHMD to using IOpenXRHMD.
-
It may be possible to remove workarounds that were previously necessary because PreInitHMDDevice was called so early.
-
Some include paths have changed. Users of private headers may need to refactor as well.
New:
-
OpenXR: Need ability to add subaction paths to action. -Added SubactionPath parameter to IOpenXRHMD::AddTrackedDevice and FOpenXRHMD::FDevice so we can create actions with a SubactionPath specifed.
-
Added unsupported message to distorted mode in default spectator screen controller.
-
VR PIE: bOneHeadsetEachProcess option allowing each separate process PIE instance to own an HMD or HMD simulator. -New setting bOneHeadsetEachProcess which when true will allow PIE separate-process instances to run without -nohmd and with -HMDSimulator which an xr plugin may consume to do special vr device simulation. Even if that does not happen if we are running with OpenXR we will attempt to create an additional OpenXR instance to connect to an hmd and an OpenXR runtime may allow us some kind of connection, these pie instances might also not run correctly. #contrib 11314
-
Added system to add additional flags to stereo layers.
-
AppleARKitFaceSupport & AppleARKitPoseTrackingLiveLink reference the Private folder of the AppleARKit module -Removed private folder access along with the includes, which are unneeded.
-
OpenXRViveTracker references the Private folder of the OpenXRHMD module -Created IOpenXRHMD interface so that other plugins can do OpenXR specific things with the OpenXRHMD implementation, rather than accessing FOpenXRHMD
-
Destroy xrInstance in PreInit to yield other plugins to create xrInstance -Destroy any openxr instance created during preinit becasue we do not yet know if openxrhmd will be the chosen xrsystem and another xrsystem may try to create instance (ie the oculus vr plugin) and then fail because the runtime only supports one instance. -CVar xr.RetainPreInitInstance can be set to true to disable this behavior. #contrib 11029
-
Add a new Platform VisionOS Project Settings panel to enable/disable VisionOS's full immersion vs window mode
-
Experimental support for VisionOS Fully Immersive -First phase of VisionOS running on device. VRTemplate will run on device. -Mobile forward renderer runs if MobileMultiView is disabled at reasonable framerate, however depth is currently incorrect (we are just writing scene color to it, depth information exists but is not yet connected). The blocky black shadow artifact is related to this. -Deferred rendering runs with a proper depth buffer.
- VisionOS: hand tracking
- Hand tracking supported via OpenXRHandTracking plugin.
-
xr.DisableOpenXROnAndroidWithoutOculus evaluated too late to modify via INI -Move PreInitHMDDevice to a point quite a bit later in PreInitPreStartupScreen so that more unreal engine systems are setup when we call it, including ini reading, cvars, fplatform memory, etc.
-
OpenXR related private header access cleanup. -Refactoring to move some cross-module included Private header files into Internal. Eliminating some includes by refactoring. Eliminating some simply unnecessary includes.
-
OpenXRAR, OpenXRInput reference the Private folder of the OpenXRHMD module -Refactored to use IXRTrackingSystem and IOpenXRHMD instead of FOpenXRHMD.
-
Added Quest 3 to list of Meta supported devices.
-
Removed deprecated motion controller component code.
-
OpenXRVisionOS non-plugin support files -The changes required for VisionOS Immersive mode that are not within the OpenXRVisionOS plugin. -Enables SimpleHMD for VisionOS (stereo rendering without a hmd)
-
OpenXR XrSystem loss/change handling. -Removed unnecessary xrGetSystem call in the FOpenXRHMD constructor. It is overwritten (for example in OnStereoStartup()) without being used.
-
Enable SwiftUI by default in VisionOS mode
-
XRDeviceVisualizationComponent now works in VREditor.
-
Added Vulkan custom resolve + tonemap subpass to support mobile hdr on Meta quest devices.
-
AppleARKitFaceSupport & AppleARKitPoseTrackingLiveLink reference the Private folder of the AppleARKit module -Removed unused include and its private include path.
-
Removed the Plugins -> OpenXR Input project settings page. OpenXR now uses the list under Project Settings -> Engine -> Enhanced Input for its Input Mapping Contexts, and passes on their priority values when generating OpenXR action sets.
-
OpenXR: vive hand tracking layer breaks oculus runtime -Added a ProblematicOpenXRApiLayerInfos ini setting that defines specific ApiLayer versions that are behaving badly with regard to an extension. -Attempt to create the openxr instance by repeatedly calling xrCreateInstance with progressively more of the potentially problematic extensions not enabled. We will either find a combination that works or never find a combination that works. -This Cl also provides a structure for implementing further problematic openxr api layer handling, should a project need further workarounds similar to this.
-
IOpenXRExtensionPlugin: Add a new function for adding suggested bindings -Allow IOpenXRExtensionPlugins to add suggested bindings #contrib 10966
-
Changed default behavior to no longer automatically perform application-side HMD recentering when we receive the event XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING from the OpenXR runtime. FCoreDelegates::VRHeadsetRecenter is now triggered whenever we receive that event, whether we're in Stage or Local space. Most primary OpenXR runtimes now only recenter LOCAL space when performing a runtime-side recentering (this recentering is transparent to UE aside from the XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING event, and can often be triggered by e.g. holding down a system button). In order to give developers more control over application behavior, they now have the option of when and whether to perform application-side recentering. This can be done in blueprints by binding an event to HMDRecenteredDelegate, which is triggered by FCoreDelegates::VRHeadsetRecenter.
-
VisionOS OpenXR wrapper -Wrap the VisionOS immersive mode api in and OpenXR layer so we can run VisionOS immersive mode through OpenXRHMD. -Simulator renders in stereo and tracks the head correctly. No on-device testing has been done and the simulator only provides one eye view, so we can't be sure it will display the second eye correctly, but I tried to set it up so it would. -Very experimental. -Known problems: Using the intermediate back buffer. No features beyond basic head tracking and stereo rendering. Lots of unused code for features that needs to be updated or deleted.
-
OpenXR Supported XR_EXT_local_floor Extension. -Adds support for XR_EXT_local_floor as an optional extension. -Change tracking origin enum field names from 'Eye' to 'Local' to better fix openxr, and because 'Eye' wasn't a good description. Added 'View' to represent actual hmd centered space. View can be used for queries but cannot be used as the tracking origin. #contrib 10836
-
Added support for the XR_KHR_composition_layer_color_scale_bias OpenXR extension. On platforms that support the extension, it can be used to apply a color multiplier and offset to the main OpenXR composition layer using the UHeadMountedDisplayFunctionLibrary::SetColorScaleAndBias() blueprint node.
- Added support for changing foveation parameters at runtime.
Bug Fix:
-
Fixed VRPIE crashing when mobile multi view is enabled and editor window is not minimized.
-
GetMotionControllerData can fail in PIE because it gets a motioncontroller from the editor. -Comparing the motion controller's world to the WorldContext parameter of GetMotionControllerData to ignore motion controllers that are not part of the correct world. -Added a comment related to an ensure that can hit if VivePort openxr layers are conflicting with the meta openxr runtime.
-
Fixed an issue where XRScribe would crash when decoding a capture with an xrBeginFrame call that returned XR_FRAME_DISCARDED, which is considered a success return and should not impact emulation.
-
Fixed an issue where frustum culled primitives not visible in the primary instanced view would be incorrectly culled in secondary instanced views.
-
Assert due to NaN passed in from Oculus OpenXR runtime with valid bit set -Added an additional openxr function call failure handling branch. The runtime should be setting the flags invalid if it entirely fails, but at least one runtime in the past did not do that so we may as well handle call failure eplicitly.
-
Fixed modulated shadows in mobile multi view.
-
VisionOS: View lagging behind head motion.Fixed problem where we were doing the copy of the swap chain render target into the compositor services drawable BEFORE rendering to the render target instead of after, resulted in displaying pixels from swapchainlength-1 in the past. Now we are encoding the blits and the compositer services present into the main frame command buffer. -Fixed problem where we were caching the device positions for late update before we update them in the render thread.
-
OpenXR LoadMap causes lag of presented frame vs hmd -The two additional render thread pumps from RedrawViewports in LoadMap resulted in one xrWaitFrame on the game thread followed by three xrBeginFrame on the render thread. This violates the OpenXR spec and put us into a bad state with the SteamVR runtime (and perhaps other runtimes). -Fixed by adding a counter to the pipelined frame state so that we can tell if the xrWaitFrame that an xrBeginFrame is consuming has already been used, and early out. A cvar exists to disable this behavior, xr.OpenXRUseWaitCountToAvoidExtraXrBeginFrameCalls, which is true by default can be set to false at startup to disable it.
-
Fixed directional light shadow rendering incorrectly in editor with android vulkan preview and mobile multi view.
-
VisionOS: problem with view transforms -Fixed bug where hmd offset was applied twice. -Fixed bug where eye offsets were never applied.
-
Fixed an issue where XR would incorrectly use the "Screen Percentage Mode for Desktop renderer" rather than the "Screen Percentage Mode for VR" setting for its Default Screen Percentage.
-
Fixed OpenXRViveTracker crashing when no HMD is connected.
-
XRMotionController component when set to HMD produces log spam -Do the special case code for the hmd before trying the more generic code for controller poses because we log an error if we try the controller code with the HMD motion source. -Added "Head" to the motion sources provided by OpenXR, so it shows up in the motion controller dropdown. Made "Head" and "HMD" function identically, "HMD" is the legacy term, "Head" the more modern.
-
Fixes to mobile multi view with mobile hdr.
Deprecated:
-
Delete OpenVR from Engine\Source\ThirdParty, it has not been used in some time. -OpenVR has been essentially replaced by OpenXR at this point and this third party source is no longer in use.
-
AzureSpatialAnchors service retirement deprecation. -Marking the plugins as deprecated and logging a warning.
-
XRGestureConfig.h can be deleted in 5.4. -Deleted it, and the function that used it, and three more long deprecated blueprint functions.
Platform Mobile
API Change:
- For example, to enable VT only for iOS, add r.Mobile.VirtualTextures=1 under [/Script/Engine.RendererSettings] category inside your project IOSEngine.ini file.
New:
-
Enabled ShaderPrint and GPUScene debugger on the mobile renderer.
-
Integrate NdoL in the MergeLocalLight when done inline in the basepass
-
Clean unused shader permutation of the BuildInstanceIdBufferAndCommandsFromPrimitiveIdsCs
-
Rework GPUScene support on mobile platforms. Platforms that do support uniform buffer objects can now provide batched primitive data through UBO. There is a limit UBO range that can be accessed in shaders, so we group instances into batches that fit into this limit. Android uses 16KB views, some other platforms up to 64KB views. Mobile platforms that do not support UBO will use a desktop version of GPUScene.
-
Merge the Local Lights in Basepass for translucent objects when r.Mobile.Forward.EnableLocalLights == 2 #localization none
-
Expose bOverride_CastDynamicShadowAsMasked in MaterialInstance Editor.
-
Store the SpecularScale in the alpha channel of the MobileLocalLightTextureB of the MobileLocalLight pass MobileLocalLightTextureB is RGBA8 now from RGB10A2 Direction is stored in RGB8 using oct24 packed as 888
-
Add ability to enable support for Virtual Textures only on specific mobile platforms
-
Fix Local lights for some mobile devices drivers Change UAV of LocalLightBuffer from SINT to UINT
-
Added logging for cases where all mesh draw commands (MDC) are forced to re-cache. Re-caching all MDC is an expensive operation and this logging will help to identify when and why it happens
Bug Fix:
-
Fix a bug of black screen on Mac mobile preview with mobile deferred.
-
Fix a bug that the bloom luminance is not scaled by Exposure.
-
Fixed rendering of debug primitives on mobile when MobileHDR is disabled
-
Changed Depth and CustomDepth in a FGBufferData from half float to a full float. Half precision for depth was causing rendering artifacts in some cases
-
Fix RenderGraphValidation for localight prepass On mobile there is a separate FMobileDirectionalLightShaderParameters UB which holds all directional light data.
-
Fix a bug that the IndirectIrradiance applied AO twice on mobile deferred, it has applied AO in the base pass.
-
Fixed occlusion feedback (r.OcclusionFeedback.Enable) interaction with sub-queries
-
Fix indirect lighting of dynamic skylight on mobile
-
Fix r.Water.WaterInfo.RenderMethod on mobile devices
-
Fixed: Case where mobile deferred shading renderer was applying movable SkyLight contribution twice, once in BasePass and then in a shading pass
-
Reworked a loop for shadow cascade selection in mobile base pass shaders to avoid rendering artifacts on Adreno 7xx GPUs
-
Make sure "Memoryless" textures are discarded by RDG at the end of the pass
-
Clamp NumLocalLights to MaxCulledLightsPerCell in MobileLocalLightBuffer when Linked List Cull is disabled
-
- Sort depth pass instead of base pass if full depth pre-pass is enabled. 2. Disable auto instancing for the translucent passes on mobile
-
Require Mobile HDR when using Mobile Deferred Shading in Project Settings.
-
Fix pixelated sun with light shaft bloom enabled on mobile.
-
Fix a crash bug of missing MobileSceneTexture uniform buffer when rendering custom depth with TAA enabled on mobile.
-
Correctly disable GBuffer output for unlit opaque materials in a mobile rendering
-
Fixed wrong stencil settings for a sky mesh in a mobile rendering. This speeds up fog shading by excluding sky pixels from it #11106 #contrib 11106
-
Fixed float overflow in a mobile bloom shaders. This was causing rendering artifacts in a scenes with very bright lights
-
Clamp number of active scene captures for mobile Deprecate calling GMaxNumReflectionCaptures and GMobileMaxNumReflectionCaptures directly to avoid errors in the future
-
Fix sharp edges of spotlights when using mobile local lights buffer
-
Fix a bug that primitives use a light channel will lose sky lighting on mobile deferred.
- Change MobileLocalLightBuffer limit from (MaxCulledLightsPerCell - 1) to the correct MaxCulledLightsPerCell when LinkedListCulling is off
Android
API Change:
- For example, add GlobalDefinitions.Add("USE_STATIC_FEATURE_LEVEL_ENUMS=1"); into MyGame.Target.cs for Android platform to compile mobile rendering only binary.
New:
-
Add support for HWAsan in NDK 26, which is available on all phones running Android >=14.
-
Update GooglePlay dependencies to use play-services-games-v2 version 19.0.0. Added support for offline access to OSSGooglePlay
-
Enable memory tracing on Android. In addition to
-trace=memoryrequirespackage_intdir/files/UEEnableMemoryTracing.txttoken file to exist to activate it as of now. -
Added bDontBundleLibrariesInAPK setting to significantly improving code iteration times by not bundling libUnreal.so in the .apk and instead pushing it separately. Opt-in and experimental as of 5.4.
-
Added UAT "-ScudoMemoryTracing" option to hook libc.so malloc/free/etc into memory tracer on Android.
-
Added option to request microphone permission for AndroidVoice module at startup (SplashActivity) to Android project settings
-
Enable Android Turnkey for launcher builds by default
-
Minor: Merge from FN-29 Do cleanup in LaunchAndroid.cpp and remove any logic that was experimental Minor: Cleanup runOnUiThread in SimpleContextWrapper.java BugFix: possible fix for FORT-699059
-
Enabling Vulkan Validation Layers on Android
- Added device profiles for Android Emulator choosing selecting Vulkan.
- Fixed Android device detection on the Android Emulator by falling back to an ES2 context.
-
Added Android static feature level and static platform information. This can be used to compile out rendering code that is irrelevant to mobile rendering only binary
-
[Android] Changed loaded SPIR-V compression algorithm
-
New: Adding AndroidSingleInstanceService plugin and engine code changes, Tested on Android with Lyra and also preflight checks.
-
New: Update AndroidSingleInstanceService plugin to properly generate ASISProject
-
Force Lowerst Lod for Sky Capture on Android
-
Support devices without lz4 compression for bDontBundleLibrariesInAPK
-
Adding support for >=2 Android devices in VS+AGDE when pushing libUnreal.so outside of .apk. Implements support for patching .vcxproj.user files.
-
PR #11247 : Add launch image for Quest devices
-
Added Android x86_64 architecture prebuilt files to launcher build
-
Enable using NDK 26.2.x
-
Report gl version string together with vulkan API version string on Android
-
Added Android SM5 device profiles for Adreno, Mali and Xclipse devices
-
Introduce short names for both
AndroidTargetPlatformControlsandAndroidTargetPlatformSettings, which are causing certain built targets to run afoul of theMAX_PATHlimit we impose on UBT file path lengths. -
Enable support for non-4k virtual page sizes on Android
- Update Android Background Services dependencies to fix support for Android targetSDK 33
- New library versions: androidx.appcompat:appcompat:1.6.1 androidx.work:work-runtime:2.8.1
-
Improving iteration times by using llvm-strip output file argument instead of copying libUnreal.so.
- Update cmake to 3.22.1
Bug Fix:
-
Fix a sky capture issue in OpenGL that occurred when binding a mipmap as a RenderTarget and sampling from a different mipmap. Fix a artifacts caused by half precision in Pixel Shader on GL.
-
PR #11428: Create separate arm64 and x64 target platforms for use with AGDE
-
Added null clipboard item check for text input
-
Kill java,exe before clean step on Windows to fix locked files issue that sometimes occurs with minifyReleaseWithR8
-
Only add Android architectures to VS project enabled in project settings
-
Kill java.exe runtime before clean step on Windows to fix locked files issue that sometimes occurs with minifyReleaseWithR8
-
Mali read-only driver bug workaround
-
Fixed an issue with EMDoneTrigger timeout failure in SuspendApp_EventThread() Bug Fix: Fixed an issue introduced recently regarding swapping W/H in portrait mode.
-
Add back new/delete operator global visibility for Android shipping builds
-
Added Xclipse 940 chipset and GPU (5xx supported and falls through to low) device profiles
-
Fix FAndroidMisc::GetCellularPreference (was always returning 0)
-
Updated Android styles to more modern base theme
-
Leave only immutable texture path for GL(only use glTexStorage2D), don't set GL_TEXTURE_MAX_LEVEL as it isn't needed anymore
-
Fixed issue with Android env vars not always set on Mac
-
Fixed an issue by Restore how app_cmd_init and restore is handled (remove ASIS STANDALONE ifdefs that are no longer needed)
-
FSceneCapturePS has highp floats forced now to fix a driver bug FullPrecisionInPS can now be enabled on a per global shader basis and not just globally controlled by r.Mobile.FloatPrecisionMode
-
Check directory exists before adding to dependency check
-
Filter out VR manifest changes from AFS project APK (uses __ExcludeFromAFS="true" attribute tag)
- Refactoring onCreate for GameActivity and switching nativemain to use AndroidMain,
-
Updating ASISStub to properly handle activity change and theme change. New: Also added gradle build files for ASISStub to make it easier to use the sample android app to test Android
- Fixed crashes due to to guarding against isStandalone in GameActivity.java.template. this fixes some AndroidSingleInstanceService crashes and activity switching.
-
Also updated ASISStub and output ASISProject
-
Fix the Safezone updated incorrectly issue, the SafeFrameChangeEvent needs to be triggered after the orientation changed. Fix the Gyro broken issue.
-
Improved checking .so files to see if we need to rebuild the .apk
-
PR #8385: Do not shutdown voice module on app stop event
-
PR #11394: Fix Android Studio path detection for installs from JetBrains Toolbox
-
Fix Zen store connection on Android if multiple ip addresses available.
-
PR #11280: Fix missing dash symbol in ShortArchNames
-
Optimized GetNetworkConnection
-
Fixed Android Single Instance Service missing files for packaging and short name used in plugin's build.cs
-
Fixed fix missing include
-
AndroidSingleInstanceService fixes to address crash and activity/surface binding issues. known issues remaining: have to pause before switching surface binding (should be handled internally eventually) need to finish up the changes for compiling reference ASIS android studio project samlple. This will be in another submit.
-
Improved startup sequence for AFS server with updated UnrealAndroidFileTool executables (added pulldir command)
-
Fixed a crash when using Android Vulkan Mobile preview platform with Mobile Multiview enabled.
- Added protection to InputDevice check for gamepads
Deprecated:
-
Deprecated: changed logic so **STANDALONE_DEBUG_LOG messages in non standalone builds for android are only output in debug builds.
-
Deprecated: **remove AndroidSingleInstanceService from engine plugins.
iOS, tvOS, and iPadOS
New:
-
iOS15+ now requires an entitlement key to enable GameCenter.
-
Initial Privacy Manifest files for iOS and Mac
Bug Fix:
- Fix a bug that the loadValuesAsynchronouslyForKeys could be invoked after PlayerItem is released in AvfMediaPlayer 2. Fix a bug that the seekToTime could be invoked after MediaPlayer is released in AvfMediaPlayer 3. Fix a bug that the loading task is still running after the MediaResourceLoader is released in AvfMediaPlayer
RAD
New:
-
Adding the RAD Audio Codec. This is a perceptual audio codec that compresses better than Bink Audio with better quality and comparable speed / memory. It is available on all UE supported platforms.
-
TextureFormatOodle make all the versioned DLLs load on demand rather than loading all up front. Add config option to force use of latest Oodle Texture version rather than the sticky version on each texture.
-
Latest Bink tools.
Bug Fix:
- Fixed a rare race condition on Bink Audio decoder startup.
Rendering
API Change:
- CVARs that can be converted into compile time constants can be found in ReadOnlyCVARCache.h Associated defines should be added into MyGame.Target.cs.
New:
-
Added the DoubleFloat math library and refactored the majority of GPU systems to use it. This is a floating point format for performing double-precision math on GPU, that offers more precision and better reliability than the tile-offset system that was previously introduced in 5.0.
-
Add ray tracing support to Cable with WPO support.
-
Added r.ShaderPrint.DrawOccludedLines (by default set to 1), which allows to disable drawing lines behind geometry on demand. Useful for complex visualizations, where drawing occluded lines makes it too messy and hard to understand.
-
Implemented support for virtual texture feedback in ray tracing hit shaders.
-
Improved performance of the manual hair skin cache and enabled it by default. This removes the need to enable skin cache for a given project. This works properly only for regular skinning (no morph target).
-
Added a new project setting configuration for the renderer (MorphTargetMaxBlendWeight), to allow configuring per project morph targets maximum blend weights. This setting can be tested with in editor using the console command r.MorphTarget.MaxBlendWeight N (where N is the maximum value we want to test). The CVar value is reset when the editor starts to the configured renderer value.
-
Added bCastHiddenShadow property to FISMComponentDescriptor so hidden shadow casting state is copied from mesh components to ISMC's
-
Fix hair deep shadow in VR.
-
Add support for additional texture layout for groom cards/meshes. This allows more compact & effecient texture layout.
-
Moved GPU-Scene update to the end of UpdateAllPrimitiveSceneInfos (now FScene::Update) to enable more efficient and consistent scene updates for sub-systems that interact with GPU-scene.
-
Initial; implementation of per-instance occlusion query based culling Perform occlusion test per instance using HZB, followed by per-pixel test for instances that were visible Use the full depth buffer for per-pixel test with feedback from pixel shader through UAV buffer (one buffer slot per instance) Feed occlusion query results from current frame into instance culling pass for the next frame Gives an average ~20% reduction in number of drawn primitives for depth and base pass, improving performance in vertex-limited scenes Add CVar r.InstanceCulling.OcclusionQueries (default: 0) Known limitations for v1: No multi-view support (though groundwork is prepared for it) No support for large number of instances in GPU scene (limited by 1D compute dispatch size, implementation planned) No support for no-cull distance (needs to be generally implemented in the main instance culling code too)
-
Apply random color to instances when visualizing mesh distance fields.
-
Add OIT permutation to base pass shaders in order to handle runtime toggle. Add RHI ROV feature to know if the runtime RHI supports ROVs. OIT permutation is only compiled when the OIT project settings is enabled. OIT permutation allows to handle case where a platform supports ROV, but the actual RHI doesn't. This also allow to toggle OIT support at runtime (through quality settings for instance).
-
Added ability to turn some of the rendering read-only CVARs into compile time constants
-
Add Point/Curve trimming report into groom editor and remove warning report during building. This information is now only displayed at import time and within groom editor.
-
Fixed stats instance counting issue for hierarchical instance culling that led to underreporting the work
-
Add Vertex Factory controlled VSM constant bias that applies to Non-Nanite geometry
-
Add debug visualization for instance culling occlusion query renderer Enabled using ShowFlag.VisualizeInstanceOcclusionQueries=1 Modified FMobileSceneRenderer::ShouldRenderHZB() to take instance occlusion culling into account
-
Exposed rect light sampling on translucent to the render setting panel.
-
Add hair cards/meshes binding & deformation support for mobile renderer.
-
Reduced memory usage of Distance Field Scene.
-
Change GPU-Scene to use persistent primitive ID instead of the packed index to reduce change frequency.
-
Improve determinism of CitySample performance testing (when -Deterministic is used).
-
GPUScene upload optimizations - Removed some primitive setup work from the new InstanceSceneDataBuffers path (that is no longer needed) - Removed copy step for FPrimitiveSceneShaderData instead writing directly to the upload buffer. - Inlined FInstanceSceneShaderData build & cleaned up includes of InstanceUniformShaderParameters.h to reduce rebuilding - Cleaned up the FPrimitiveSceneShaderData a bit - Removed dummy identity transform and needless matrix work for single-instance primitives.
-
Moved VSM distant light invalidation logic before init dynamic shadows such that we can skip (non-nanite) mesh setup for fully cached lights.
-
enable lens flare pass in mobile platform
-
Added a cvar to force skylight cubemap blending per platform for forward shading.
-
Improvements to RHI performance when using raytracing hit shaders.
-
Improve noise on hair transmittance and shadow by replacing jitter noise with a blue noise function which removes structural noise.
-
Optimized Hierarchical Instance Culling update mainly by separating static and dynamic primitives along with some further low-level optimizations.
-
Added cook-time precomputed spatial hash for hierarchical instance culling, controlled via r.SceneCulling.Precomputed (default enabled).
-
Reduce cooked Groom size by 45%.
-
Avoid to build invalid groom bindings and add clearer error message when groom binding is invalid
-
Add holdout support for grooms.
-
HairCardsVF now supports PrimitiveID & GPUScene on mobile platform.
-
Added support for directional light in scattering for mobile volumetricfog.
-
Add r.HDR.Aces.GamutCompression (disabled by default) for HDR output so that we get a similar behaviour to the BlueCorrection parameter. https://docs.acescentral.com/specifications/rgc contains more details about gamut compression
-
Avoid re-creating whole rendering state for a primitive when MaxDrawDistance or InstanceCullDistance has changed. HLOD system often updates MaxDrawDistance and InstanceCullDistance for a big number of primitives which can cause performance issues on a weaker platforms
-
Added SkyAtmosphereLightIlluminanceOnGround node.
-
Add groom AutoLOD mode. This automatically scale grooms' curve count based on screen coverage and adapt the hair coverage to preserve the look in distance. AutoLOD can be enabled/disabled per project. Groom asset will use project setting, but can override it per asset (Default, Manual, Auto). AutoLOD is enabled by default which improves hair performance overall.
-
Removed r.OptimizedWPO as it is no longer useful and causes confusion as we default bEvaluateWorldPositionOffset to true for primitives.
-
Remove point to root index indirection as now interpolation already contains this data. This avoids an indirect fetch. This also fixed what looks like a long standing issue where the curve index was reinterpreted as the point root index.
-
Add Depth of Field Use hair depth property on PostProcessVolume.
-
Enable anisotropy on cards texture samplers.
-
Fixed bug in hierarchical instance culling that caused the footprint-based test to never be selected.
-
Add possibility to use strands guide as card guides for card groom having non-conforming topology (i.e. triangles strip).
-
Fixed incorrect implementation of parallel prefix-max operation in the instance culling load balancer. New version is also rather more efficient.
-
Deprecated UInstancedStaticMeshComponent public functions & data that concern a loosely supported ID mapping. This will be removed in favor of new ID based functions.
-
Optimize hair lighting for local lights by adding OnePass VSM ShadowMaskBit & OnePassHairTransmittance support for DeferredLightPS.
-
Batch groom LOD selection, groom interpolation, groom simulation to improve performance.
-
Move ray tracing instance culling completely to the GPU.
-
Added path to make instance culling context pull the instance count from the Scene and bypass Mesh Draw Command re-caching (new behavior can be disabled using the cvar r.InstancedStaticMeshes.FetchInstanceCountFromScene).
-
Added VSMResolutionLodBias to light scene proxy. Controls the resolution of the shadow map on a per-light basis
-
Made SceneUniformBuffer publicly accessible, allowing plugins to add their own data without modifying engine code. This buffer is included in many render passes.
-
Help compiler to compile out unused "Shading Path" renderer code on platforms with a static feature level. (This cuts ~2.5MB from a mobile only binary size)
-
Added cvar ('r.InstancedStaticMeshes.AllowCreateEmpty', off by default) to make it possible to create ISMs with zero instances.
-
Improved Render Thread performance in Ray Tracing code paths.
-
Added new SupportsLandscape() vertex factory flag, and removed hardcoded VF string checks determining if a landscape material should compile with a given VF.
-
Optimize groom asset & groom binding asset building (~4x speedup).
-
Improvements to deferred decal CPU performance.
-
Add TriStrip geometry support for hair strands and add project settings for hair tristrip geometry as not all project are compatible with this (e.g., 2 CVs short hair).
-
Add option to force velocity output for grooms.
-
SkyAtmosphere - added multiple scattering support on the directional second light for parity.
Bug Fix:
-
Fix global distance field not being built in some situations even though materials in the level require it.
-
Depth-of-field stays consistent when adjusting the Squeeze ratio on the cine camera.
-
Fix for HDR viewports not rendering properly when Slate.EnableGlobalInvalidation=1
-
Fix GPU crash when using OIT pixel sorting.
-
Fixed thick lines being clipped with ortho views because near clip distance is set to 1 then. This fixes the water landscape brush which relies on canvas draws for updating curves render target (!)
-
Fixed crash when using r.RayTracing.Geometry.MaxBuiltPrimitivesPerFrame to limit number of BLAS built per frame and Nanite is enabled.
-
Fixed volumetric fog extinction being affected by exposure.
-
Removed quadratic memory usage of detecting overlapping vertices when cooking skeletal meshes
-
Fix memory leak when the level editor viewport is set to realtime but it's not visible, e.g. if another editor is docked and active in the main window.
-
Fixed an issue where debug traces would fail to draw correctly in offset stereo views.
-
Fixed memory reporting for 2D array texture resident mips
-
Fixed some spline mesh rendering bugs on mobile platforms with GPU Scene enabled.
-
Fix crash in hair voxelization buffer allocation when having 16 macro groups or more, with large bounding boxes.
-
Changed contact shadows UI to be disabled if "Cast Dynamic Shadows" is off as this means contact shadows are disabled too.
-
Fixed incorrect colors in HDR screenshots.
-
Fix uninitialized Groom deformer OutputMask value causing the output position to not being updated consistently.
-
Fixed volumetric cloud not receiving high quality aerial perspective in the secondary far traced cloud buffer.
-
Fix missing cards data on multi-group /multi-geometry type grooms. For LOD0/LOD1, grooms have both strands & cards data. The LOD settings are set to strands geometry type for LOD0/LOD1 . When building the groom data, the cards data were discarded due to the mismatch of geometry type. It works for group0 as a matter of facts but all groups >0 would have not data being built.
-
Fix hair instance streaming sharing same asset.
-
Fix missing screen shadow casting on non-shadowed light for hair strands samples.
-
Fix incorrect groom shadow casting not respecting hidden in game / hidden shadow casting flags on instance.
-
Fixed a case where volumetric fog ambient would not be lit correctly due wrong ambient sampling source.
-
Fix hair flickering when LOD transit between strands and cards LOD.
-
[Custom Primitive Data] Fix crash when adding elements on a BP instance placed in the scene
-
Enable separate translucency depth upsampling on SM5 platforms instead of only d3d
-
Fix ResolvedView not resolve before using on MobileHQDof Setup Pass. Fix ScreenSpacePos caculate bug on MobileHQDof Setup Pass.
-
Fixed incorrect Distance Field / Card Representation when multiple mesh sections with different settings point to the same material slot.
-
Reenable depth bound test when computing shadow mask for hair shadow. This improves hair lighting cost.
-
[Custom Primitive Data] Fixing detail customization where the color picker would previously only commit the first channel.
-
[Custom Primitive Data] Prevent Colorpicker from closing when picking a color
-
Fix groom binding asset being rebuilt while being already cached. The logic for filling the DDC key, used later for warming local DDC, as incorrectly run too early. This causes the logic to check if data are available to fail, and forcing the data to be rebuilt.
-
Only include draw commands with HasPrimitiveIdStreamIndex flag in occlusion query instance culling list
-
Split hair binding root bulk/resources into seprate data/resources per LOD to fix crash when concurrent mesh LOD are streamed-in.
-
Fix reversed green and blue conditions for SetMeshConstantVertexColor
-
Fixed missing landscape geometry at the edges of the screen related to GPU culling that may happen at a certain landscape configurations
-
Fix incorrect local bound when creating dynamic instance uniform buffer. The local bound and (overriden) local to world transform were not expressed in the same space (original vs. overridden)
-
Fix for out of bounds GPU memory accesses (on some platforms) in ThreadGroupPrefixSum and VSM directional projection (Short circuit VSM page table lookup with out of range clipmap levels, avoids an out of bounds access on some platforms)
-
Fix missing bound scale on groom component.
-
Made ShadowCacheInvalidationBehavior override HasDeformableMesh such that it can suppress that behavior if needed.
-
Fix hair/groom view mode in cook build.
-
Fix cached raytracing instances not being updated when mesh LODs are streamed in/out causing incorrect LODs to be used in ray tracing.
-
Fixed crashes caused by Spline Mesh and Hierarchical Instanced Static Mesh components creating scene proxies while their mesh has LODs that are not streamed in.
-
Fixed incorrect ray tracing culling of ray tracing instances using WPO.
-
Fix hair cards/meshes reloading when changing assets properties.
-
Fix a bug of CSM caching that the static primitves are renderred twice.
-
Fixed an issue with D3D12 where failing to allocate a resource might not report to the user that it is out of memory.
-
ShouldPrepareDistanceFieldScene should return true when VisualizeMeshDistanceFields or VisualizeGlobalDistanceField is active
-
fix .exr/.pngs sequence alpha channel corrupted with MRQ on some platforms.
-
Fixed case where StaticMesh will not be rendered if component overridden MinLOD is less than StaticMesh MinLOD
-
Fixed: missing Texture2DArray information in a 'listtextures' command dump
-
[Custom Primitive Data] Fix issue where editing the Custom Primitive Data fields on a BP instance in the world didn't stick.
-
Add coverage/tangent fallback on card groom when no texture are provided.
-
Fix ensure when accessing the default material during water PSO collection from the game thread
-
Only pass PerInstanceRandom parameter from VS through interpolators only if PS uses it. Also fixed broken PerInstanceRandom for cases where GPUScene is disabled
-
Fix incorrect group names when groom does not have group ID mapping.
-
Fix missing group name on groom asset once imported.
-
Fixed inaccurate luminance/illuminance meter values in Visualize HDR mode.
-
Fix for VRS getting disabled on projects using film grain (i.e. CitySample)
-
Fix for leaking render objects on app exit caused by EngineLoop not processing the last set of pending cleanup objects it acquired
-
Request full garbage collection when FPreviewScene is destroyed to ensure that the PreviewWorld is destroyed immediately, together with any GPU resources it might still hold through FScene. The preview world is a heavy-weight object and may hold a significant amount of resources, including various GPU render targets and buffers required for rendering the scene. Since UWorld is garbage-collected, this memory may not be cleaned for an indeterminate amount of time. By forcing garbage collection explicitly, we allow memory to be reused immediately.
-
Fix CoordU channel not being correctly generated during hair strands texture generation.
-
Fix OIT sorted triangle index buffer crashing on creation due to data not being streamed-in at creation time. When the data are not ready yet, this CL postpone sorted index buffer initialization later, until the data are ready.
-
Fixed an issue where Contrast Adaptive Shading (Tier 2 VRS) would not be applied correctly to views with constrained aspect ratios (black bars).
Deprecated:
- Deprecated IPersistentViewUniformBufferExtension.
Architecture
API Change:
- Changes to custom render pass API :
- Made all class members protected/public in order to help with eventual deprecation Added utility to have a custom render pass perform a render capture operation (full capture, begin capture, end capture) when it runs Added BeginPass / EndPass functions, that run right before/after PreRender/PostRender, which are only really useful for properly scoping the render capture operations described above BeginPass/PreRender/PostRender/EndPass are now non-virtual. Child classes now have to implement the virtual On[...] version of them Added proper class for custom render pass user data (same lifetime as the render pass) and allowed multiple user data to be attached to a custom render pass, identified by a FName, which allows custom render data to be retrieved in a safe way by any module. Currently, the system was only used by landscape so it was working, but really, any render pass could hold any kind of user data so this would have crashed * Added bare-bones RTTI system to both render passes and render pass user data (GetTypeName). Use IMPLEMENT_CUSTOM_RENDER_PASS (and IMPLEMENT_CUSTOM_RENDER_PASS_USER_DATA, respectively) to implement it
-
You can use the new SetMeshDrawCommandStatsCategory() on primitive components to set category types for the new stats.
-
We still need to maintain old SoftObjectPtr reference (and sync load) for backwards compatibility. Also note that the new system depends on the AssetManager seeing the EditorOnly reference. So existing content will need a resave to take advantage of the new system.
- Added GetShaderResourceTexture() to FRenderTarget that returns the RT's RHI texture resource by default but can be overridden to return another one, for classes where the shader resource RHI may differ from the render target resource RHI (FTextureRenderTargetResource and its child classes : e.g. FTextureRenderTargetCubeResource)
New:
-
Optimized compute pipeline state creation/management to use a thread local cache like graphics already does, avoiding significant write lock performance problems in ExecuteSetComputePipelineState.
-
- Changes to custom render pass API
- Fixed water info render captures (r.Water.WaterInfo.RenderCaptureNextWaterInfoDraws) when running with custom render passes (r.Water.WaterInfo.RenderMethod 2)
- Changes to custom render pass API
-
Add mesh draw command stats collection. This collects information about each draw call in each pass used during mesh draw command rendering. It reads back indirect args to get the correct final rendered instance and primitive counts after GPU culling. Use "r.MeshDrawCommands.Stats" to show the new stats on screen.
-
Fix PreskinnedNormal of skeletal mesh when skin cache is on
-
Added a VulkanRHI vkTrimCommandPool call between map loads to free up extra memory reserved for command buffers
- Added support for per instance LOD on InstancedStaticMeshComponents. This improves on the old behavior which would select a single LOD for all instances based on the full ISM bounds. LOD is handled by the GPU instance culling system.
- The new approach is used if GPUScene is enabled and instance culling is enabled and bUseGpuLodSelection is true on the component. Also the consolevariable "r.InstancedStaticMeshes.GpuLod" can be used to turn the system on and off.
-
Break apart FD3D12DescriptorCache SetSRVs, SetUAVs, and SetSamplers so you can allocate and copy GPU descriptors and retrieve the handles without actually setting descriptor tables (needed for an upcoming GPU feature).
-
Added an option for InstancedStaticMeshComponents to use conservative bounds.This will not iterate over all instances to recalculate the bounds on every instance add/remove/transform update. But instead will maintain a conservative bounds that can only grow. This is an optimization for the case where we might have very high instance counts causing the bounds calculation to become very expensive. The behavior is off by default, and controlled by SetUseConservativeBounds(). Even when the option is turned on for an ISM, we keep the existing behavior whenever the number of instances is below "r.InstancedStaticMeshes.ConservativeBounds.Threshold".
-
Implementation of Custom Render Pass - Supports rendering depth prepass and base pass, output scene color and depth - Replacing the underline implementation of rendering scene capture depth as additional scene view - Added water plugin support
-
Reduce default file cache size used by virtual texturing. Add profiling to track file cache usage.
-
Refactored D3D12 ray tracing descriptor heap/cache functionality into a more generic utility usable outside of ray tracing when explicitly managed descriptor tables are necessary (includes renaming FD3D12RayTracingDescriptorHeapCache -> FD3D12ExplicitDescriptorHeapCache, FD3D12RayTracingDescriptorHeap -> FD3D12ExplicitDescriptorHeap, FD3D12RayTracingDescriptorCache -> FD3D12ExplicitDescriptorCache)
- The material NaniteMaterialOverride no longer uses a SoftObjectPtr to hide from the cook. Instead we take advantage of new SkipOnlyEditorOnly cooking and use an EditorOnly ObjectPtr instead. This avoids issues with sync loading during PostLoad().
Bug Fix:
-
Fix D3D12 TerminateOnOutOfMemory to not pop up a message box when running -unattended, causing build machine jobs to spin for 30m until timeout instead of crashing in just a couple minutes.
-
Add GPU instance culling to decal passes. This fixes an issue where HierarchicalInstancedStaticMeshComponents containing decals would only show a single instance.
-
Add custom depth support to nanite geometry collection.
-
Fixed RDG validation with indirect args being accessed in a debug shader as a structured buffer while indirect args are actually plain buffers
-
PR #10647: Fix RoundUpToVSyncError value in FDynamicResolutionHeuristicProxy::RefreshCurrentFrameResolutionFraction_RenderThread() #contrib 10647
-
Fixed synchronous read back functions for cube textures
-
Fix follower component lagging behind lead component. Dynamic data updates for skinned mesh components happen in parallel, i.e. follower component can update before lead component. As follower component relies on lead component's current revision number, updating the revision number in dynamic data updates create race condition. So change back to updating current frame revision number immediately when animation updates, and add a previous revision number variable to help calculate current revision number.
Deprecated:
- Removed RenderTargetTemp.h, which isn't used anywhere anymore
Lighting
New:
-
Fix alpha channel in Ray Traced translucency and add Holdout support The alpha channel is now tracked like in other passes (it was not working consistently before). This applies both to RT translucency and the RayTracing Primary Ray debug view.
-
Remove deprecated RTGI indirect lighting technique Lumen is a superior alternative in all cases and is the supported system going forward.
-
RayTracing: Implement a new light grid used in raytracing passes (Translucency and Lumen Hit Lighting) based on the method used in the Path Tracer The new light grid can localize the influence of each light better than the previous system, reducing the number of lights that light loops need to process. This refactor also allows more than 256 lights (no code was actively depending on this limit anymore). However there is still a fixed number of lights available per grid cell. Using the "Light Grid Occupancy" Ray Tracing Debug mode can help visualize where this might be occurring. The following cvars can be used to control memory usage and performance: r.RayTracing.LightGridResolution: Resolution of the 2D grid which holds lights r.RayTracing.LightGridMaxCount: Maximum number of lights per grid cell (if there are fewer lights than this in the scene, that number will be used instead)
-
Added cvar to mark only even/odd mips from local lights. This can be used to cut down on instance duplication, which can be a New performance cost especially for higher poly/larger non-nanite meshes. r.Shadow.Virtual.MarkPixelPagesMipModeLocal Even mips mode (1) cuts down on instances but can increase the resolution vs. the default mode for some pages. i.e. fewer instances/vertices, but more pixels. Generally a performance win for non-Nanite geometry, but a potential performance loss for Nanite geometry. Odd mips mode (2) cuts down on instances and resolution so has a higher performance benefit, but can be a noticeable loss in resolution. From Pari at The Coalition
-
Removed "Draw only VSM invalidating objects" and associated code. This had been broken for a long while and there are different visualizations available now.
-
Support nanite overdraw visualization in VSMs. This is preliminary and subject to change but lays the groundwork for more nanite-related VSM visualizations.
-
Respect bCastShadows and bCastRayTracedShadows in Lumen / Many Lights HWRT.
-
Only Destroy/Add Light Primitive Interactions when needed on light transform update On mobile this means we only invalidate MDC's when needed
-
Add support for rect light texture to volumetric fog.
-
Added VSMTexelDitherScale to the light scene proxy, analogous to r.Shadow.Virtual.SMRT.TexelDitherScale
. Controls the amount of temporal dither filtering applied to shadows on a per-light basis. - Add virtual shadow map "dynamic resolution" controls that can decrease the global resolution LOD bias based on page pool pressure to avoid page pool overflows.
- Relevant new cvars: r.Shadow.Virtual.DynamicRes.MaxResolutionLodBias (maximum amount it is allowed to modify, default 2) r.Shadow.Virtual.DynamicRes.MaxPagePoolLoadFactor (page pool filled factor beyond which the bias will begin to apply, default 0.85)
-
Improve sampling of specular highlights at high roughness to minimize the number of wasted rays
-
PR #11174: Add LowerHemisphereColor to fast path for updating skylight scene proxy #contrib 11174 #11174
-
Allocate VSM shadow mask slots based on pruned light grid rather than relying on sorted light order. This avoids issues with simple lights getting sorted to the front of the list (required for some other passes) and wasting slots, and makes the allocation more robust against light ordering..
-
Add light channel support for cluster shading. This allows to batch more lights through the cluster shading path.
-
Added lighting channels support for VSM.
-
Add rect light support for cluster shading.
-
Added EditCondition to light transmission to force user to set the light to moveable prior to activate light transmission.
-
Add IES Atlas support for translucent surface.
-
Change default VSM page marking to 2x2 stride. This lowers the overhead of the page marking pass and to date has not produced any artifacts.
-
Skip unnecessary page marking and SMRT work for shadow receiver pixels behind rect lights From Pari at The Coalition
-
Fix incorrect ref counting decrement when texture are removed from rect. light texture manager.
-
Integrated Bend Screen Space Shadows in Mobile Renderer.
-
Add support for IES profile in cluster shading pass.
- Changed the default value r.Shadow.Virtual.ForceOnlyVirtualShadowMaps to 1. Primitives that are incompatible with VSM will not be rendered, but performance and memory is improved.
Bug Fix:
- Fix issue with r.SceneCulling 1 where instance culling was not respecting the detail geometry flag (and thus rendering all the small stuff into coarse pages)
- Make clipmap visualization colors based on absolute level so they are consistent with the clipmap virtual address space visualization
- Add a cvar to scale the size of the nanite occluded instances buffer. This is not really a proper fix for overflows, but the cvar allows testing if flicker/shadow issues are due to this.
-
Add support for directional light's ShadowAmount for hair mask shadow and fix incorrect shadow mask channel writting in hair mask shadow.
-
Fix rect light filtering border with non power of two texture. This fix invalid colored at texture border which could happen since the atlas is never cleared.
-
Fix the screen space denoiser causing ray traced transmission leakage. Add another bilateral filtering weights specific to transmission for Screen space ray traced shadow denoising. So shadows on subsurface profile will behave the same to other material, and the transmission will be filtered separately. The spatial filtering weight will be set to 0 if the reference and the neighbor pixels are not all subsurface profile. Suggest: Increase r.Shadow.Denoiser.PreConvolution to 2 to remove the border line neglectable transmission artifact due to temporal accumulation if needed.
-
Fix distance field shadow on SLW.
-
Fix Reflection capture removal causes the primitive GPU state become dirty.
-
Fixed per-object / modulated shadows in mobile forward renderer.
-
Fixed some bugs causing incorrect results in DFAO.
-
Fixed an issue where non-VSM shadows were missing for Nanite geometry if there was no static shadow map. Nanite primitives are now included in static, non-static and uncached shadow maps instead of static only, and use Nanite primitive filtering to select the primitives with the matching mobility on GPU.
-
Fixed issue where distance field shadows and far shadow culling would not work correctly when r.Shadow.Virtual.ForceOnlyVirtualShadowMaps=1
-
Fixed popping in distance field shadows when new distance field mips are streamed in.
- Fix hash collisions in raytracing auto-instanced mesh batches
- In some rare cases different materials could be detected as identical by the ray tracing auto-instancing code, leading to incorrect appearance. This was most noticeable with path tracing which uses ray tracing for primary rays, but could happen in any ray-tracing based pass as well.
-
Fixed incorrect upsampling in distance field shadows that caused minor artifacts.
-
Fix incorrect rect lighting on translucent light grid.
-
Fix overflow when computing rect light texture MIP causing incorrect atlas packing.
-
Fixed bug where downsampling capsule shadows would cause a crash in rare cases due to a groupsize of 0
-
Fixed issue in distance field shadows when using r.HeightfieldShadowing.
- Solve OOB access of FLocalLightData when LinkedListCulling is off. Add GetMaxLightsPerCell that returns GMaxCulledLightsPerCell when LinkedListCulling is off and NumLocalLightsFinal when it is on Replace calls of GetNumLocalLights with the GetMaxLightsPerCell where it would cause an OOB if used with LinkedListCulling off
Lumen
New:
-
Added multi-bounce reflection support for standalone Lumen reflections.
-
Added performance overview view mode to Lumen. It visualizes pixels requiring dedicated reflection rays and is useful for reflection performance optimization. Accessible either from the Editor UI or from console (r.Lumen.Visualize 2).
-
Implemented wave32 wave ops version for ScreenProbeConvertToIrradiance in order to make it faster on GPUs which support wave32, but don't support wave64.
-
Added support for multiple scattering approximation w.r.t. project setting
-
Release Lumen GPU resources when Lumen is being disabled at runtime.
-
Optimized Global Distance Field update by overlapping clipmap updates and merging initial culling pass.
-
Log asset name when encountering a mesh card with corrupt derived data.
-
Optimized FLumenMinimalPayload size by replaced PrimitiveIndex and PrimitiveInstanceIndex with a single GPUSceneInstanceIndex.
-
Added capture of translucent meshes into lumen card for ray traced lumen reflection&refraction.
-
Exposed screen space trace settings in the Post Process Volume
-
Add light function altas support for Lumen scene lighting. This allows all ligths with (compatible) LF to be batched during Lumen scene lighting (-0.1ms)
-
Replaced float epsilon comparison in Lumen Front Layer Reflection with a float precision relative one to make reflections work the same independent from the camera distance.
-
Reduced leaking caused by the World Space Radiance Cache.
-
Disable RAY_FLAG_FORCE_NON_OPAQUE when it's not needed - it's only used for a short distance from the surface in order to skip back faces in some tracing methods. This speeds up Lumen with hardware ray tracing by 0.1-0.2ms on consoles.
-
Turn noise into less noticeable structured error by constraining random ray directions to a smaller subset which can be handled by a temporal accumulation.
-
Don't build the ray tracing light grid when it isn't used. This saves ~0.12ms on consoles when hardware ray tracing is enabled.
-
Improve Lumen card add/remove. Change most of the tracking logic to use bitfield for fast indexing (2x/3x improvements).
-
Change Lumen scene lighting to batch light with IES profiles since IES profile are now atlased and can be dispatched in one pass. Save 0.1ms during LumenSceneLighting with 100 scattered IES lights.
-
Exposed "Max Roughness To Trace Reflections" the in Post Process Volume. New CVar r.Lumen.Reflections.MaxRoughnessToTraceClamp can be used to clamp it for scalability purposes.
-
Fixed light function to be clamped, avoiding making shadow area too bright.
-
Merge Lumen mesh cards requests allocation to remove array growing cost. This reduces UpdateSurfaceCacheMeshCards from worst 54ms -> 14ms avg: 28 -> 5ms.
Bug Fix:
-
Fix race condition between Lumen scene lighting, and atmosphere transmittance update. This could cause some flickering when the directional light parameters are animated (which would reset the directional light transmittance value).
-
Don't require DFAO to be enabled in order to compose Landscape into the Global Distance Field, as other systems like Lumen may also be using it independently.
-
Fixed "r.Lumen.ScreenProbeGather.Temporal.RejectBasedOnNormal 1" causing artifacts due to mismatching history scene normal (overwritten by water) causing constant temporal history rejection.
-
Fixed cloud shadow support
-
Fixed crash when using SM5 shaders with hit lighting. Hit lighting uses wave ops inside ComputeDirectLighting, which are not supported on SM5.
-
Fixed crash when only Lumen translucency volume is using hardware ray tracing
-
Fixed stale indirect lighting bug when switching scalability levels or switching GI quality through the Post Process Volume.
-
Fix missing normal bias for screen space reflection tracing.
-
Fixed Lumen Screen Probe Gather when tile tile classification is disabled.
-
Fixed Lumen cards for landscape : those require the landscape fixed grid vertex factory now (this was working in the editor because of an unrelated bug) * Included those shaders in PSO precaching as well
Materials and Shaders
New:
-
[Shaders] - Implement recompile shaders on file save functionality for the editor. - Adds a directory watcher to watch for changes in //Engine/Shaders/... for usf/ush/h files. - When a file changes issue a
recompileshaders /Engine/Shaders/Private/PostProcessGBufferHints.usfcommand. - This code should be WITH_EDITOR only. - This is opt-in behavior and can be turned on with r.ShaderCompiler.RecompileShadersOnSave=1 -
Modify Cvar r.Shaders.WarningsAsErrors to only apply to global shaders when value is 1 (and all shaders only when value is 2 or more) The default value is still 0 (off), but this gives a better mechanism to investigate shader warnings on global shaders.
-
[Shaders][Optimization][EditorInitiative] - Instead of calculating the Material DebugGroupName for every shader we draw with, calculate it once per material and cache it. - TryGetShaders submits shader jobs for missing shaders. If a shader was missing it would calculate a DebugGroupName for the material for each shader. - Instead we now cache this once and store on the FMaterial. In my test scenario I saw large speedups on the Render Thread: - ~7x speedup to the average render frames that were heavy w/ draw command building after opening a map. - ~4x speedup to the worst case render frames.
-
Holdouts: Implement the holdout flag for the deferred renderer When the holdout flag is enabled, the object will render black with an alpha matching the background. This is implemented with an extra condition in the basepass. The logic is only added to the base pass pixel shader when the project is configured to have post processing of the alpha channel to minimize the impact on games.
-
Allow warnings as errors cvar to be set per platform
-
[Shaders][Material Editor] - Add generic, data driven key, value shader statistics. - Shader stats are simply key (FName) and value (POD types) that are stored per-shader. - A Shader Statistic is a variant that can take on the following POD types: bool, float, int32, uint32 - Currently don't support strings since those weren't as trivial to implement (needed conversion and special case code to support serializing these to the memory images required by shader maps) - Adds another shader statistics row in the Material Editor that will show the platform specific stats. - The platform statistics are turned into a comma and newline separated string that is displayed to the user. - Bump the shader output worker version since I'm changing the output file format (to contain the stats). - The shader compiler output stores the stats as a
TMap<FString, FShaderStatVariant>. Serializing across FNames between Shader Compiler Worker and the main process wasn't working (different name tables). - When storing and serializing the stats to the shader map we convert them to FNames. (seeFShader::FShader()) -
[Shaders] - Discard non-stripped, original shader source to save on memory. Saves ~2x of the memory tracked by the LLM tag ShaderCompiler in small projects. For Lyra this saved ~600MB during a cook. - If we need the shader source (i.e. material stats in the editor) we still keep the data around. The editor compiles shaders on demand and doesn't try to load these from the DDC so we don't have to worry about cache pollution. - Shader Debug Info also needs this information so we keep it around if developers are running with this enabled. - Added a helper function to the job input which determines if we need to store the original source code. NeedsOriginalShaderSource()
-
[Shaders][ODSC] - Implement on demand shader compilation when recompile all materials after saving a material function. - Reduces shaders compiled from 13,000 to 300 in my test case - ~4 seconds saved in UMaterialFunctionInterface::ForceRecompileForRendering due to not having to build and submit shader jobs.
-
Add prioritization to the categories on UMaterials The order is the following organized by most important and grouping similar areas together: - Material - Nanite - Translucency - Translucency Self Shadowing - Refraction - World Position Offset - Post Process Material - Mobile - Forward Shading - Physical Material - Physical Material Mask - Usage - Lightmass - Previewing - Import Settings
-
Transformed MaterialTemplate.ush to use named parameters
%{num_tex_coords}instead of%spositional parameters. - Introduced Material Translation DDC caching.
- This update introduces a caching system for material translation outputs. Now, after a material is translated, the intermediate results are saved in the Derived Data Cache (DDC) for later use. When a translation for a material is needed, the system first queries the DDC for the existing combination of the base material, parameter sets, and platform-specific information. If this data exists, the stored results are retrieved, bypassing the need for a costly translation process and separating material translation from shader generation. The key benefit of this update is that updates to the material template source file or any dependent shader files no longer require the material to be retranslated. The material shader can still be generated accurately using the cached translation results. This ensures that the material string generation consistently uses the most current input shader files.
-
Add dynamic ray traced translucent shadows (off by default). It is available to high end PC. 1. Change the default to not trace translucent materials for shadow to align well with Lumen where translucent material does not cast shadow. 2. Use 'r.RayTracing.Shadows.Translucency 1' to turn on the dynamic ray traced translucent shadow. The shadow term is the accumulated visibility based on opacity.
- With UE 5.4 we have done a fairly significant overhaul of how shader compilation jobs are queued, where shader compilation-related work in the cook process is executed (significantly improving parallelization), and how we identify and cache potential duplicate shader jobs. Significant effort has also been invested in optimizing all parts of this pipeline. The results of this work:
- Approximately 30% fewer shaders compiled due to improved deduplication (numbers from internal projects, your mileage may vary)
- Significantly less game thread overhead when submitting and processing shader compilation work
- Significantly faster shader preprocessing
- All of the above have contributed to a drastic improvement in project cook times, particularly when shader invalidations occur.A quick overview of what we're doing differently under the hood:
- Shader preprocessing and deadstripping is now executed in the cooker/editor process as part of job submission, rather than being the first step of the compile process.
- Cache keys for individual shaders (used for the existing in-process job cache, and for per-shader DDC entries) are constructed based on this preprocessed & dead stripped source.
- As a result of the above, when per-shader DDC queries are enabled this can drastically reduce the amount of shader compilation work that is needed when a shadermap is invalidated, since results for individual jobs may already be available in the cache. Even without per-shader DDC, however, this still provides an improvement due to improved deduplication of jobs via the existing in-memory job caching mechanism. Note that as of 5.4, per-shader DDC is still only enabled by default for the editor on-demand shader compilation usage; however as an experimental feature for 5.4, we've added the ability to cache individual shader compilation results via DDC during cooks. When used in conjunction with a shared DDC via ZenServer, this reduced impact of shadermap invalidation extends to the cook process - in usage in internal projects this has reduced the frequency of cooks which compile a large number of shaders by an order of magnitude. If you'd like to experiment with this feature you can enable the following cvars: r.ShaderCompiler.PerShaderDDCCook=true r.ShaderCompiler.JobCacheDDCEnableRemotePolicy=trueWe expect to enable these by default for UE 5.5. Note that it is not recommended to use this feature in conjunction with a file share based shared DDC; the overhead of pushing/pulling data from the fileshare outweighs the benefit (shared Zen server is much more performant).Note there are a couple of caveats to be aware of with the preprocessed shader job caching feature:
- When per-shader DDC is enabled (via ODSC or otherwise) it's no longer a guarantee that any change to a shader source file will trigger compilation; whitespace, comments, and dead code will all no longer result in mutation of the key used to identify a particular shader compile job. To force a shader invalidation you must now use a new mechanism based on #pragmas, see ShaderVersion.ush for an example of usage. This file as such can still be used to force recompilation of all shaders - however all such pragmas found during preprocessing will be automatically included in the hash we use as the cache key for shader jobs, so it's possible also to perform more granular/targeted invalidations with this mechanism.
- The shader source passed to the compiler is now stripped of all comments, line directives and blank lines. As a result when debug information is generated for shaders, filename associations will not be available when inspecting via debugging tools (RenderDoc and friends). If this is problematic, the feature which controls this has a cvar toggle and can be disabled locally via: r.ShaderCompiler.PreprocessedJobCache=false
-
CookShadersCommandlet for generating a subset of shader symbol files based upon input params Can filter from a ShaderSymbols.info file, or by material name directly
-
Expose virtual texture physical pool settings in the project engine settings UI. Enable live edit of the settings, with physical pools being recreated on changes. Add config option to auto grow physical pools whenever a pool is oversubscribed. The config option applies in editor only. There is an additional consolevariable "r.VT.PoolAutoGrow" that does the same thing in cooked builds.
-
Added logging of total shader compile worker memory usage in out-of-memory conditions
-
Do not compile Raytraced input on a RayTracingQualitySwitch material node for platforms that do not support ray-tracing
-
Change D3D diagnostic buffer to output readable assert message (file/line/condition/message). Use with check() / checkf()
-
DirectXShaderCompiler (DXC) has been enabled by default for all remaining SPIR-V shader backends.
-
Added a 'default' overlay material option to a skeletal mesh asset. When assigned this overlay material will be used if component does not override it
-
Properly aggregate material stats when performing multi process cook. These stats will be reported when we report shader stats: === Material stats (aggregated across all cook processes) === Materials Cooked: 1583 Materials Translated: 1275 Material Translate Time: 1.70 s - Materials Cooked, Materials Translated, and Material Translate time are the stats that are aggregated and reported to analytics. - Piggyback the material counters aggregation in the existing shader stat aggregation for simplicity. - Removed outdated, or not impactful material cook stats. In most cases these values are extremely low and don't matter for a cook.
-
Added new runtime virtual texture "Displacement" format intended for use with Nanite displacement. This uses a 16bit UNORM texture, or when set to compressed will use BC4.
-
[Shaders] - Add LLM markers to track memory of shader compilation to help diagnose out of memory issues. - Instruments: (FShaderCompilingManager::SubmitJobs, FShaderCompilingManager::ProcessAsyncResults, GlobalBeginCompileShader, FShaderJobCache::FindOrAdd)
-
Add a toggle r.AreShaderErrorsFatal which controls whether or not DefaultMaterial and global shader errors are fatal. - This defaults to
True, which is the current behavior. - The idea is to turn off Fatal errors (and just Error) in situations where we want to see all shader compile errors and not simply just stop when Default Material or global shaders fails. -
[Shaders] - If shader dev mode is on assume that any shader errors from materials are due to source code (and not the material graph). - This way shader retry on error works for material shaders (right now it only works for global shaders and the default material). todo: Fix a bug that causes the retry on compilation to still report the errors even after they are fixed.
-
This change modifies the chain of shader preprocessing to avoid back-and-forth conversions between wide and ANSI characters, providing a significant performance boost to shader preprocessing time.
-
Make support for virtual texture 16bit page tables configurable using the consolevariable "r.VT.Support16BitPageTable". Defaults to on which is the existing behavior.
-
Added support for a writing fixed color when baking the low resolution streaming mips for a runtime virtual texture. This replaces the fixed "debug" color and allows us to use the feature outside of debug usage. Added r.VT.RVT.MipColors consolevariable which uses the fixed color support to generate runtime virtual texture pages using debug mip colors. This is useful for debugging issues with materials sampling higher resolution mips than expected. Added support for custom expansion distance for runtime virtual texture volume bounds.
-
Modified the code that adds comments to all shaders containing all define names and values such that this is only added to the debug USF file rather than being included in the shader source passed to the compiler.
-
Significantly refactored the shader preprocessing code such that all shader formats now execute a common function for the bulk of preprocessing, and those that have their own implementation only deviate in minor ways from the common path (typically by setting additional defines that are not known at job creation time).
-
Add a command line option to the cooking server to skip cooking unsolicted packages. - This adds
-odscwhich for now just skips unsolicted packages. - This would only be used when you are launching the cooking server to just process ODSC recompileshader requests and not cooked packages. -
Do not compute per-instance parameters (fade amount, show/hide, dither) in a vertex shader if material does not use them
-
ShaderMinifier - Use memstack for various temporary allocations
-
Added translated world space (camera-relative) options to several material expressions with a worldspace input or output. Using translated worldspace is more performant and more precise than absolute world position.
-
ShaderMinifier - Optimize BuildLineBreakMap, SkipUntilNonIdentifierCharacter, ExtractIdentifiers and few other bits Generate line directive map during parsing Use xxhash instead of cityhash Avoid FStringView operator [] in ExtractIdentifiers Use TArray Reset instead of Empty where appropriate Vectorize SkipUntilNonIdentifierCharacter Vectorize ExtractBlock Vectorize line ending search Use FString directly instead of FStringBuilderBase for the final output to avoid a copy
-
Added a new "Always Evaluate World Position Offset" material property to force World Position Offset to be always evaluated, meaning that it cannot be disabled by "Evaluate World Position Offset" or "World Position Offset Disable Distance" on the component.
-
Added an API to get approximate committed memory usage for local shader compile workers
-
Remove non-WPO position from interpolators if pixel shader does not need it
-
Report the number of shader type and vertex factory type permutations to cook analytics. - Aggregate all the shader type permutations and report them as
Shaders_NumShaderTypePermutations- Aggregate all vertex factory type permutations and report them asShaders_NumVertexFactoryTypePermutations -
Implement
recompileshaders listtypescommand. - This dumps a list of all shader types and vertex factory types in the engine. It is dumped in csv format and includes class name and shader file name. - This list is useful in combination with otherrecompileshaderscommands to compile a single shader (where you need the file name). - Minor formatting and whitespace fixing. Example: Cmd: recompileshaders listtypes ShaderTypeName, Filename FHardwareVideoDecodingYCoCgAlphaPS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf FHardwareVideoDecodingYCoCgPS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf FHardwareVideoDecodingY416PS, /Plugin/WmfMedia/Private/MediaHardwareVideoDecoding.usf ... VertexFactoryTypeName, Filename TWaterVertexFactory< true>, /Plugin/Water/Private/WaterMeshVertexFactory.ush TWaterVertexFactory< false>, /Plugin/Water/Private/WaterMeshVertexFactory.ush FNiagaraSpriteVertexFactory, /Plugin/FX/Niagara/Private/NiagaraSpriteVertexFactory.ush FNiagaraRibbonVertexFactory, /Plugin/FX/Niagara/Private/NiagaraRibbonVertexFactory.ush FNiagaraMeshVertexFactory, /Plugin/FX/Niagara/Private/NiagaraMeshVertexFactory.ush FVectorFieldVisualizationVertexFactory, /Engine/Private/VectorFieldVisualizationVertexFactory.ush -
Display human readable DDC key for the DefaultMaterial. - This is to help debug and diagnose missmatched DDC issues between streams.
-
Add tile support to default SSR without clear. 1. Use
r.SSR.TiledComposite 1to enable tiled SSR (off by default). 2. User.SSR.TiledComposite.Visualize 1to visualize the current tiled SSR when SSR is enabled -
Improved volume texture visualization material creation to use a MaterialExpressionBounds node instead of a custom HLSL node.
-
Add strongly typed EShaderOptionalDataKey to access shader optional data instead of adhoc characters
-
Improved error reporting for global shader compilation failures; now the shader type, permutation, and debug info paths will be included in error messages printed when such failures occur.
-
Adds r.Shaders.SymbolsInfo option which generates a singular ShaderSymbols.info in lieu of full PDB info. Useful when full shader PDBs are impractically large, but some PDB information is desired.
-
Added new "Bounds" material expression to expose object local, instance local and pre-skinned local bounding boxes info with a single node.
-
Add support for not unmapping all pages when invalidating a runtime virtual texture. Previously the behavior was to only keep locked root pages mapped and produce them in the current frame. Unmapping all other pages caused flickering, because it will take a couple of frames to get GPU feedback requesting them for remap. This change adds the consolevariable "r.VT.RVT.DirtyPagesKeptMappedFrames" and defaults it to 8. Pages that had GPU feedback in the previous number of frames set by this are kept mapped but queued for update. Setting the to 0 should give the old behavior. The behavior of the pages queued for mapped update is also changed so that it is no longer handled in the current frame but time-sliced along with other unmapped updates.
-
Only log shader compile stats if we've compiled more shaders since we last tried to log stats. - Printing still happens on an interval (controlled by CVarShaderCompilerStatsPrintoutInterval) - If we have hit our interval, and the number of shaders compiled is different since last time, we print.
-
Do not compile Nanite input in "Nanite Pass" material expression for platforms that do not support Nanite
-
Introduced material translation logging to MaterialTranslationLog.txt, containing the list of all translated materials since startup and their translation time.
- Source shader filename is propagated to to dxc instead of using a placeholder
- This improves readability when using third party profilers
-
Runtime virtual texture volume can now be enabled per platform. This removes overhead of physical pool allocations that aren't needed when materials disable runtime virtual texture sampling per platform. Runtime virtual texture volume can now be enabled only if Nanite is turned on. This is useful for the new Nanite only use case of Nanite landscape displacement.
- Added an "Allow Variable Rate Shading" checkbox to material details under Materials -> Advanced. This setting is checked by default.
- When unchecked, the material will be opted-out of all Variable Rate Shading, both per-draw (Tier 1) and screen-space (Tier 2).
- Materials using the Masked Blend Mode are opted-out by default
- Only allocate virtual texture physical texture pools when there are allocated virtual textures using the physical space. This removes a common case of unnecessary memory allocation when a streaming virtual texture has been loaded but is unused.
Bug Fix:
-
Fix Subsurface Profile material in scene capture with r.SubsurfaceScattering set to 0 causes wrong value in alpha channel.
-
Fix threading race condition in virtual texture release that could lead to intermittent crashes during very heavy streaming.
-
Improved the way we handle null expression in MaterialFunction expression collection. Made GUID invalidation when null expressions are detected on MaterialFunction::PostLoad() deterministc so not to bloat the DDC with new shadermaps. Added a message box on MaterialFunction save that informs the user their function is corrupted and needs to be checked-resaved.
-
Nullptr check to prevent CanPasteHere from crashing.
-
Make FTargetPlatformManagerModule::ShaderFormatVersion thread safe
-
Fix incorrect mips streaming and assert firing when a runtime virtual texture has both low mips removed and a low resolution mip streaming texture.
-
Fix Subsurface Profile has artifacts if it is behind a translucent material that uses its basecolor
-
Fixed the shader debugging "direct compile" mode; debug USF files dumped with other shader debug info now contain a serialized form of the environment instead of relying on fragile commandline parameters to set this up correctly.
-
This change reworks how shader parameter metadata influences DDC keys by constructing a strong hash of the parameter layout for all parameter structs once on engine startup. This should resolve once and for all any bugs with shaders not being properly invalidated when shader parameter structs are changed in code (specifically when no related changes are made to the HLSL code at the same time).
-
Fixed an issue where materials using the Masked Blend Mode could become invisible when using MSAA with a 1x MSAA count.
-
Handle line directives in ShaderMinifier ExtractBlock() * Fix reporting line numbers in shader compile errors/warnings
-
Fixed a bug resulting from global shader jobs colliding when preview platforms are enabled; this was causing missing global shader permutations when previewing.
-
Fix the r.VT.PoolSizeScale console variable so that it can be changed at runtime and pools will immediately adjust.
-
Fixed an issue where overriding "Has Pixel Animation" in a material instance might not have any effect.
-
Fixed custom material expressions changes not updating cached materials.
-
Fixed the shader BRDF header files generated in code so that this occurs prior to loading and caching shader source file information. This occurring in the opposite order was resulting in these headers potentially being out of date when compile jobs were submitted.
-
Fixed crash occurring in FMaterialEditorUtilities::GetVisibleMaterialParametersFromExpression when a function input isn't found.
-
Refactored CompileDebugViewModeShaders() to include material shader error checking solving an Editor hang situation.
-
Correctly disable rendering of overlay material if Max draw distance set to a negative value
-
Add null pointer check to FindInputdByName().
-
Fixed ShouldCache call being bypassed when getting shaders, which could lead to missing shader types on cooked build while ODSC would instead let them build if requested. Now ShouldCache should be respected in all cases : if it returns false, the shader will be missing both with and without ODSC.
-
Fix the runtime virtual texture format "Base Color, Normal, Roughness" giving a washed out appearance. This was because the BaseColor texture wasn't set to sRGB.
-
Fix to UMaterialExpressionNamedRerouteUsage::CompilePreview crashing when opening a material.
-
Fixed batch files output for PC DXC shaders when debug info is enabled (these batch files can be used to execute DXC shader compilation directly rather than via ShaderCompileWorker).
-
Fix for crash occurring when linking a node to the UV input of a Texture Sample.
-
Fixed a bug where hair strands would be cooked out on Windows if the project had ES31 shaders as an option, even though they would be usable at runtime when rendering with SM5/6 shaders
-
Fix verbose logging of shader hashes to be deterministic - parts of the FSHA1 struct are seemingly intentionally uninitialized, but further hashing this struct itself doesn't really make sense. We now instead copy the incremental state and generate a "final" hash after each file; this isn't the hash of just that file but rather the hash of all files up to the point of that file, which is not perfect but good enough to track down real nondeterminism issues.
-
Added null check to FHLSLMaterialTranslator::GetMaterialEnvironment() to avoid crashing when a referenced Parameter Collectino fails to load (e.g. no longer exists).
-
Fixed crash occurring when linking a node to the UV input of a Texture Sample.
Nanite
New:
-
Nanite Tessellation: Can now enable dynamic view dependent tessellation on materials that are applied to Nanite meshes. With Nanite Tessellation enabled you can dynamically displace the surface through the new Displacement output pin in the material.
-
Implemented RDNA 1 & 2 ISA parser to optionally detect if a compute shader has any need for implicit derivatives (image sample, ddx, ddy, etc.). Certain shaders can be marked with CFLAG_ExplicitDerivatives, indicating the shaders prefer to handle derivatives explicitly, and this instructs the shader compiler - on supporting platforms - to parse the compiled ISA and look if any instructions requiring implicit derivatives are present. If none are found, the shader is decorated with NoImplicitDerivatives, indicating it is safe to ignore shading quads, etc..
-
Massive CPU optimizations to Nanite CS materials (add to scene, and also per-frame dispatch). Also includes optimizations to cache coherency, memory reductions, much more maintainable code, and also includes an important fix to hash the shader bindings (dynamic instancing hash) instead of explicitly hashing things like the FLightCacheInterface* and lighting policy. The previous logic would explode the # of shading bins (2-3x) when features like static lighting were enabled, even when most of the LCI's ended up pointing to the same light map resources/constants. This change also parallelizes the bulk of BuildShadingCommands, and removes the front loaded TPimplPtr from FNaniteShadingCommand and instead put it around the pass specific members to keep the important data on contiguous cache lines.
-
Heavily optimized InitViews and ComputeRelevancy for Nanite scenes (up to 8x faster on the render thread in CitySample) - requires Nanite compute materials to be enabled. == Off by default pending extensive testing (r.Visibility.SkipAlwaysVisible=1 to enable) Now all the primitive arrays are kept sorted into a "tested" vs "always visible" partition, which are then internally sorted by proxy type for cache coherency, using the primitive component ID as a tie breaker and to improve determinism (new implementation of FPrimitiveArraySortKey) The partition split location for "tested" vs. "always visible" is very efficiently calculated from the TypeOffsetTable using only a few loop iterations (as opposed to scanning the array), stored in Scene.PrimitivesAlwaysVisibleOffset (~0u if no always visible partition, or if optimization is disabled) The partition split location is aligned up to the next full dword - this is to avoid having a single dword spanning "tested" and "always visible" primitives making the lockless parallel calculations much more efficient. This will push a few (<32) primitives from always visible into the tested path, but this is not a big deal. FPrimitiveSceneProxy has a bIsAlwaysVisible flag (default false) that determines which partition it gets sorted into. Nanite determines this value with Nanite::FSceneProxyBase::SupportsAlwaysVisible() Countless places now only iterate from 0...StartOfAlwaysVisible range instead of 0...NumPrimitives, dropping the tested primitive count by orders of magnitude. r.Nanite.OptimizedRelevance=1 has been in place for a few years now, so this optimization now enforces optimized relevance in !WITH_EDITOR builds, and relies on assumptions from this (r.Nanite.OptimizedRelevance has been baked down and cvar removed) Nanite forces off IsUsingDistanceCullFade now so that any Nanite proxies going through FrustumCull will no longer test for fade distances (which are not even supported by Nanite) A new UpdateAlwaysVisible tasks is launched prior to FrustumCull (which waits on ray tracing if needed), and then FrustumCull waits on this new task. This task is responsible for filling the PrimitiveVisibilityMap for always visible primitives, and also for testing ray tracing culling per primitive for the TLAS stat initviews now contains an additional "Always Visible" timer that shows the thread time spent on processing the always visible primitives (primarily ray tracing cull tests for the TLAS) - this is not a measure of wall time though, as it's largely async Renamed (to match other methods like prepass) FDeferredShadingSceneRenderer::IsNaniteEnabled() -> ShouldRenderNanite() and moved it to the base FSceneRenderer under a virtual that can be checked in the FComputeAndMarkRelevance task Deleted legacy and broken r.Visibility.PrimitiveCull.SkipNanite cvar and logic FPrimitiveSceneInfo::CacheNaniteMaterialBins now calculates material relevance across all shading pipelines, and merges them into a combined primitive view relevance struct (without any view dependent bits, as Nanite does not have any per-view relevance tests that are respected) The combined Nanite relevance is now merged into FViewInfo at the end of FComputeAndMarkRelevance::Finalize(), after waiting for the CacheNaniteMaterialBins task to finish (which computes the combined relevance) Switched FrustumCull and UpdateAlwaysVisible tasks to use RESTRICT instead of GetData() to allow the compiler to perform additional optimizations Nanite "tested" primitives no longer create mesh draw commands when going through FDrawCommandRelevancePacket::AddCommandsForMesh FRelevancePacket::Finalize() now completely skips creating visible cached mesh draw commands for the NaniteMeshPass Optimizing the relevance code was critical after pushing 60k+ primitives (in CitySample) down the always visible pass, because now there were ~124k static mesh relevances to process, which would previously rely on accurate visibility. It was an insane amount of overhead to compute something that is effectively not a per-primitive or per-mesh decision in Nanite. Nanite Proxies using features like custom depth, lighting channels, or static lighting will be forced down the "tested" path. Additionally, the editor will disable the "always visible" optimization due to various features like hit proxies or debug view modes relying on dynamic relevance (this will hopefully be addressed in the future).
-
Nanite rasterizer scheduling rewrite - massive CPU/GPU/Memory optimizations (avoiding 2-4x redundant work in most cases, overlapping passes to fill bubbles, reuse rasterizer pass results between main vs post and !tessellated vs tessellated). Also makes it very flexible to support multiple rasterizer passes efficiently, and try different overlapping schemes
-
Initial Nanite support for RHI shader bundle dispatch functionality (exclusively in CS material path)
-
Implemented graphics pipeline support for shader root constants
-
Improved culling effectiveness by adding explicit instance hierarchy cell bounds (r.SceneCulling.ExplicitCellBounds), as well as debug rendering of cells (r.SceneCulling.DebugRenderMode).
-
Initial support for Nanite displacement scaling to work for MICs (upload and fetch via UB instead of baking into base material template)
-
Refactor of Nanite fixed function rasterizer binning fallback ** - Fixes race condition with FixedFunctionBin where it would usually not be set by the setup task prior to shading binning RDG pass running - Fixes issue where even if FixedFunctionBin wasn't racing, a scene with no fixed function materials would have no fixed function bin to search for - Fixes cases where spline meshes and/or two sided would fall back to a fixed function bin that wasn't capable of rendering correctly - Simplifies the 100% disable case by only having a single codepath - Now supports raster binning shader selectively choosing which raster bins remap to fixed function (i.e. supporting by distance or other criteria)
-
Updated the Variable Rate Shading manager, Contrast Adaptive Shading generator, and Foveated Shading generator to allow generating a shading rate image with a 2x2 pixel tile size, smaller than that supported by hardware VRS. This "software VRS image" can be generated on its own by toggling on r.VRS.EnableSoftware 1 (even on platforms that do not support VRS) or alongside a typical hardware image, and can be requested by rendering passes designed to use it in their compute shaders (currently only Nanite base pass).
-
Implemented Nanite mesh shader support for VK_NV_mesh_shader extension, and re-enable VSM mesh shader rasterization now that the the arg wrapping is implemented and we're D3D12 mesh shader spec compliant.
-
Shader root constants support (initially) for DX12 - shader bundles now have a very fast path that pushes record index and 3 arbitrary pass data parms into root constants without the need for a global uniform buffer.
-
Optimized Nanite CS material sort key, saves ~0.16ms in CitySample Nanite BasePass without bundles (4.79ms -> 4.63ms) The general idea now is: First group all shaders with the same bound target mask (UAV exports) Then group up all shading bins using same shader but different bindings * Sort indirect arg memory location in ascending order to help minimize cache misses on the indirect args
-
Lightmap support for Nanite CS materials
-
Updated Nanite texture coordinate encoding so that it is always crack-free and better handles texture coordinates with very high repeat counts.
-
Enabled hierarchical instance culling & precomputation by default (r.SceneCulling). This improves instance culling performance for dense scenes like CitySample significantly, in particular when there are many local lights.
-
Optimized Nanite combined material relevance with always visible path
-
Added a new "Enable Tessellation" option to materials to explicitly enable or disable tessellation (and therefore displacement) in materials and material instances.
-
Enable r.Visibility.SkipAlwaysVisible by default now
-
Fully disable the "skip always visible" optimization under WITH_EDITOR for now (only cooked builds will run it)
-
Implemented Nanite tessellation visualize modes (patches, (micro)triangles, and tessellation)
-
RDNA disassembler fixes: Support for DS instructions, Fixed DS microcode format, and Added missing instructions
-
Added a new Nanite Visualization mode for pixel-programmable rasterization.
-
Optimized Nanite transcode pass to run faster on Intel ARC GPUs.
-
Added "Max Edge Length Factor" to the Nanite Settings of Static Mesh to mitigate oversimplification of Nanite meshes that are intended to be deformed (e.g. via World Position Offset or Spline Mesh Component).
-
Added CFLAG_ShaderBundle and decorated Nanite CS materials with it (some platforms can use this to build relevant data structures for internal bundle implementations).
-
Cleaned up shader bundle public API to remove unused buffer arguments, changed record index and platform data over to root constants, and fixed some flow control issues on some platforms.
-
Enable Nanite shader bundles by default
-
Added LerpUVs property to Nanite static mesh settings. Enabled by default. When disabled UVs are not lerped in the simplifier. This is useful when data stored in UVs isn't valid to interpolate, for example indexes. Allows the AnimToTexture plugin to be used on Nanite meshes without rendering artifacts.
-
Updated Nanite DispatchBasePass to new shader bundle dispatch API
-
Hooked up Nanite CS materials to CPU visibility culling results, and also significantly optimized CS material PSO retrieval.
-
Improvements to RDNA ISA logic
-
Implemented Nanite material visibility support for CS materials, significantly dropping CPU overhead in certain scenes (matching what PS materials already supports)
-
Implemented new work in progress shader bundle dispatch API, that can take an aggregation of compute shaders / pipelines, a GPU generated dispatch XYZ count buffer, and launch a platform specific method of compacting/removing the zero sized dispatches from the aggregation, while also doing as little work on the CPU as possible.
-
Implemented Nanite tessellation stats
-
Improved Nanite disk encoding that is typically ~10% smaller after compression at the same quality.
-
Significant improvements to Nanite rasterization performance for pixel programmable materials (Masked/PDO) on the order of 30-50%.
-
Reduced the footprint of an internal Nanite buffer, saving some persistent VRAM with Nanite.
-
Added proper mip sampling of displacement maps in materials with Nanite tessellation.
Bug Fix:
-
Fixed an issue where Nanite tessellation would crash on Vulkan when using NVIDIA graphics cards
-
Fixed the selection of Nanite collision meshes in Player Collision view.
-
Fix a bug where the substrate outputs get mixed up in Nanite CS materials when "Velocity Pass" in Project Settings is set to "Depth Pass".
-
Sampling an out of bounds UV set with Nanite now clamps to the highest available UV set instead of returning zero, which is consistent with the non-Nanite behavior.
-
Fixed an crash when clearing the Cached Cooked Platform Data on a nanite displaced mesh. The Cache Tasks where not canceled and would sometime crash when destroyed.
-
Fixed issue where the Nanite builder would crash on meshes with extremely large position coordinates.
-
Race condition fix for Nanite CS materials using parallel cmd list submission (bundles disabled). Lifetime of visibility data was tied to RDG, but the parallel cmd lists can outlive RDG since they are not waited on until dispatched much later.
-
Don't warn about using legacy IO path for Nanite if the game is not packaged with pak files
-
Fixed a bug where some Nanite clusters would not be culled by the global clip plane, causing visual artifacts in things like planar reflections and portal rendering.
-
Fix bugs with motion vectors on Nanite objects that have both materials with and without WPO when the project setting for "Velocity Pass" is set to "Depth Pass"
-
Fixed a bug where Nanite materials would get mixed up when enabling/disabling sky lights in the scene.
-
Improved (and correct) implementation of Nanite fast tile clear optimization. This new version fixes issues where even fully Nanite shaded tiles would not write through all/any of the gbuffer, but we would still unset the metadata (resulting in uncleared gbuffer / hall of mirrors). New implementation builds a per material bound target mask (based on shader reflection), masks that against possible bound targets suitable for the optimization, and then the clear shader determines which tiles are safe to optimize the meta data, and the rest are cleared by the regular hardware path.
-
Fix a bug where all Nanite will render for a scene capture with "ShowOnly" actors enabled, but has an empty list.
-
Fixed an issue where recently disoccluded Nanite objects would not render properly in non-instanced secondary stereo views, such as splitscreen views.
-
Fixed issues with Nanite spline meshes calculating an incorrect tangent frame.
-
Fixed issues that prevented tessellation from working with Nanite spline meshes.
-
Race condition fix for CS materials with split screen, where View0 and View1 were sharing the same batched parameters memory, and trampling on each other during parallel command list recording.
-
Fixed issue where Nanite Tessellation would crash on Intel ARC GPUs
-
Fixed Nanite custom depth rendering to render correctly with r.CustomDepthTemporalAAJitter=0.
-
Fixed an issue with missing Nanite Landscape rasterization shaders in cooked builds.
-
Fixed some bugs with ray tracing Nanite spline meshes (still only ray traces the fallback mesh).
-
Fix some race conditions in new Nanite raster scheduling (do not use the DispatchContext indirection lists on the render thread as the setup task may not have completed yet). Also fixed a GPU sync issue during patch splitting (pre-existing bug) where the indirect args were not present in the pass parameters, so RDG would not issue barriers for it.
-
Fixes to Nanite fast tile clear on some platforms where the sub tile mode can be different than morton order
-
Temporarily disable Nanite CS materials for Vulkan until there is support for CS explicit derivatives and implicit LOD
-
Fixed a bug where negative scale in Nanite spline mesh parameters would cause the faces to be flipped.
-
Fixed issue where cooking multiple platforms at once could cause some of them to be missing Nanite streaming data.
-
Fixed an issue where a random Nanite object could appear selected in wireframe view when no objects are selected in the editor.
-
Fixed custom depth rendering in right eye when Instanced Stereo is enabled with Nanite objects in view.
-
Fixed Issue where Nanite imposter rendering would output incorrect depth values
-
Fixed issue where rasterization of extremely long and thin triangles would not be watertight on some hardware.
-
Fixed a bug with Nanite spline meshes where spline deformation might be randomly disabled on the mesh, due to using the wrong rasterization shaders.
-
Fix for Nanite raster bin recompile shader crashes
-
Fixed a rare crash caused by the Nanite builder simplifying a cluster to 0 triangles.
-
Fixed Nanite picking visualizer from crashing on some platforms during GPU buffer readback, and improved the overall code
-
Fix for issue where Nanite builder would not handle empty submeshes correctly.
-
Correctly clamped rough VRS shading rates to 2x2 max for Nanite Software VRS. Software VRS is no longer disabled in areas using 2x4, 4x2, or 4x4 rates.
-
Hardware ray tracing now respect the Minimum LOD index property for Nanite geometry.
-
Fixed incorrect == operator for FVirtualPage in Nanite streaming manager, caught by static analysis
-
Fix race conditions / lifetime with parallel cmd list recording and Nanite shading commands. Reactivate Nanite parallel base pass recording
Niagara
New:
- Heterogeneous Volumes: Shadow-casting support and integration with translucency pass.
- Enabled via Heterogeneous Volumes category of Heterogeneous Volumes.
-
The new Niagara Asset Browser revamps the menus when creating Niagara Emitters and Niagara Systems, as well as adding Emitters to existing Systems. It is similar to the Content Browser, and offers tagging functionality to organize your assets.
-
Niagara per particle mesh LODs - This is disabled if we can not run the sort / cull process (i.e. OpenGL RHI) as we don't have a CPU LOD path currently
-
Modify sim cache buffer data to be packed into a single array - Add optional BulkData serialization, controlled with bAllowSerializeLargeCache - Large caches (BulkData) can grow beyond 2GB and are considerably faster to serialize in the editor - Small caches will use TArray serialization and are not optimal. These are useful when sending data as text across the network for debugging for example as BulkData serialization is not supported by all FArchieve types - Clean up sim cache includes to reduce compiles - Update existing SimCache tests #virtualized
-
Validation rule for user data interfaces
-
Add InsideVolume output to RVT sample - Change user parameter binding to be a UObject rather than exposing URuntimeVirtualTexture to Niagara
-
Filter out attributes (for linked inputs) that are not allowed in the current usage context.
-
Static mesh DI add socket sampling to safe CPU access functions
-
Make Niagara Data Channel assets a BP Type so BPs can reference them.
-
Change default for NDC DIs overriding spawn group when spawning particles. Preferred method is to now use the GetNDCSpawnData function.
-
Add option to select particle mesh LOD based on component bounds - All particles will render at this LOD
-
Remove "experimental" tag from Niagara sim caching plugin and enable by default
-
Add platform set to Niagara System to allow systems to be culled for specific platforms / quality levels
-
Add option for ribbon plane normals to follow the geometry rather than face screen / custom facing vector - This is now the new default as it matches the other ribbon shape modes - Existing content will use the previous mode
-
Double-clicking a data interface function in the graph will now open the c++ source file
-
Add cache comparison functionality to arrays
-
Add optional CSV memory usage output for FX, mode is controlled with fx.DetailedCSVStats.MemoryMode and disabled by default as it impacts performance - Implement GetApproxMemoryUsage for Niagara and use this function in the debug HUD so we display Cascade memory usage
-
Typing '/' in Niagara Script graph's action menu will now prioritize the 'Divide' action
-
Added a new module to play looping audio
-
Applying HeightFog and VolumetricFog in-scattering and attenuation to Heterogeneous Volumes.
-
- Added initial parameter support to the audio data interface * Reworked the existing audio modules a bit with better default values + added a module to initialize parameters
-
Static variables can now be linked to non-static inputs of the same underlying type
-
Add a pool for RDG texture / buffers - On some platforms artifical barriers were being added (i.e. d3d12) which resulted in slowdown - In my test for 400 dispatches with a neghbor grid it went from 3.6ms of GPU to 0.33ms
-
Add platform set to sorting rules
-
New Blueprint API to read/write data channels added new nodes that automatically generate matching pins for the data channel used added versioning information to data channel assets, so dependent assets can pick up on changes
-
Heterogeneous Volume Component: Add ability to set VolumeResolution within a blue print
-
Add ability to append to an existing simulation cache - Frames that are before the current simulation age / tick count will be culled - BeginAppend can be called vs BeginWrite and it will handle the initial setup if the cache is invalid - Update capture library with a new call so that we can specify all the parameters, such are removing timeouts, should we append, etc.
-
Expose FFT solver for 2D gases
-
Add SourceMode to object reader, allows you to easily read from the attached actor - Add support for invoking BP get functions to read properties - Fix issue with alignment on FVector4's
-
Add auto attachment information to the HUD
-
Show compilation error when writing to attributes from the wrong namespace (e.g. particle script writing to system namespace). This will be just a warning for 5.4, so old content can be fixed up (configurable via project settings).
-
Add support for specular scale with the simple lights. Includes support for Niagara to set the attribute per light through the light renderer. #virtualized
-
Optimizations to activation saves ~10% - 20% depending on system
-
Added details panel support to data channel BP node, so users can exclude pins from being written to
-
Enable GPU particles & sorting for Quest 2/3
-
Niagara task priorities can be set per tick group - This helps to reduce wait times if we execute a simulation later and allows us to fit around physics tasks
-
Set display name of Niagara double type to "float", as that's what is used internally for simulations and is also similar to the way Blueprint handles double types (which still display as float in the ui)
-
Add GetTriangleIndices to skel mesh DI (This mirrors the functionality from static mesh DI) - Add Interpolated methods to get skinned vertex data to match triangle / bone
-
Added a validation rule to make sure some modules are only used once per script
-
Add warning to Niagara compile results if the constant table contains a NaN
-
Niagara action menus: Removed parameter action favoring and halved NPC parameter search score. This should result in somewhat more accurate search results.
-
Debug HUD add performance unit selection (millisecond / microsecond) - Add an auto mode to the perf graph for the unit scale
-
Enable quick release of particle memory
-
Added integer-based equal/not equal ops for enum graph pins
- Added Spawn Count Scale UI to emitter nodes
-
Changed the scalability indicator to function as a toggle button to enter & exit scalability mode
-
Allow newly spawned systems to avoid adding to concurrently running simulations - Situations can occur where we execute the simulations in a TG and then attempt in a subsequent TG or an async task on the GT to add to the concurrently running simulation - The new path will push the instance into an existing simulation that is not running concurrently or a new system simulation - This also fixes a potential issue with TG transfers where we might of added to the wrong simulation - The CVar fx.Niagara.WorldManager.AvoidAddingToExecutingSims can be used to flip between old and new behavior
-
Simple tick group based exec ordering for systems reading from NDCs. We define a tick group which reads must be ordered after. Reads before, or writes after this TG emit a warning.
-
Use explicit pin types on op nodes for type casting of connected inputs
-
Test execution state before performing the LWC tile boundary test - This fixes an issue where crossing tile boundaries while deactivating could bring the instance back to active
-
Add cast shadows option to sprite / mesh / ribbon renderers
-
Add LOD mode to Mesh Renderer - Allows you to specify a LOD level to use or a LOD bias based on Min LOD - If the LOD level is not available it will fallback to the next available lower level
-
Add support for reading the Skin Cache to Niagara Skel Mesh DI - Add a project setting (enabled by default) to control if this is enabled as some lower end platforms could have issues with the additional Buffer's
-
Validation rule to check if sorting is enabled on sprite / mesh renderers
-
Default SubUV blending to enabled on mesh / sprite renderers
-
Added a hlsl function to generate unique random numbers picked from a given range (FastUniqueRandom)
-
Added visualizations for volume textures stored in sim caches
- Niagara Notes have been refactored:
- Works with (almost) all kinds of stack rows now (inputs, properties etc., not just entire modules)
- Supports editing of notes after submitting them
- 'Full Display Notes' can now be converted to 'Inline Notes' by clicking on the note icon
- UI access via right click menu or on-screen widgets.
-
Couple of optimizations to HLSLcc, replaces the use of a hash table to store referenced variable information with an std::multimap and optimizes the amount of data that needs to be copied as scope changes (if/loop/function) based on the instructions in the body of the scope rather than the entire outer scope. Validated against all shaders to produce the same result. In the case of Niagara VM shaders a particularly expensive system update script's compile time was brought from 16s down to 6s.
-
Add support for SetEmitterEnabled in Niagara - Similar to Cascade this will halt all spawning, but won't naturally complete the emitter this will follow how emitter state is setup
- Support Spawning into any emitter from one shared DI. New value Engine.Emitter.ID available in the Map Get node. This is the current emitter's ID.
- Several NDC Data Interface functions now require an emitter ID if they interact with a specific emitter. For example when spawning via SpawnConditional.
-
Debug draw for Position Array Data Interface
-
Niagara template for painting 2d coordinates to a Render Target using Simulation Stages.
-
Enable Niagara Debugger in UEFN Editor.
-
Removed category from asset options in favor of the new Asset Tags
- Path tracing updates for Heterogeneous Volumes.
- Prevent per-frame grid build once simulation completes. Remove r.PathTracing.HeterogeneousVolumes variable, inheriting system default behavior.
-
Fixed delete icon in Niagara parameter collection editor Fixed deleting an entry in a parameter collection via hotkey (instead of using the button) Fixed top level area expansion state
-
DisableAdvancedFeatures in Niagara Preview Viewport - This saves a lot of memory per Niagara VP that is created by disabling things like Lumen
-
Added Orbit Mode option to Sim Cache Editor Viewport. Orbit Mode defaults to enabled to match parity with the Niagara Editor Viewport.
- Optionally construct velocity buffer for heterogeneous volumes
- r.HeterogeneousVolumes.Velocity (Default = 0)
- Updated Overview Node UI for collapsed Emitter nodes Features:
- a thumbnail image that has to be manually taken by clicking on the Thumbnail button in the collapsed Emitter node.
- toggles for 'Determinism', 'World/Local Space' and 'CPU/GPU'
- When clicking on the node, summary view is displayed
-
Show restricted content stack errors for scratch pads that use things like custom hlsl nodes
-
Fix Blueprintcallable vs DLL exposed inconsistencies
-
GDME Niagara shadow opts - Early out if all views can never create a mesh batch & improve per view early out for shadow passes - With 30 instances of a test asset this was ~3.0ms -> ~1.8ms for GDME. We still had a couple of renderers casting shadows but the majority do not.
-
Changed Lerp C pin's friendly name to 'Alpha'
-
Added analytics for system data, cascade conversion and sim caches
-
Hierarchy Editor: Visuals are a bit more consistent with the rest of the engine - Changed the layout from a horizontalbox to a splitter. Allows resizing of the the three columns
-
Niagara renderer can now provide a streaming scale for materials - This fixes an issue with sub image streaming for sprite renderers where the calculation did not take into account that the UVs would be scaled
-
Engine.Owner.Velocity will read the owner actors velocity for the initial frame rather than defaulting to zero - This fixes an issue where reading this attribute in emitter / system spawn scripts or a burst on the first frame would always have zero velocity
-
Add an optional name to validation rules - This makes it easier to know what you are breaking #changelist validated #virtualized
-
Change IsVisible for pooled components to only check the attached components level collection rather than the attached component - This mirrors what Cascade does and fixes an issue with gameplay cues that are attached as they are sometimes attached to hidden components but we don't actually want to hide our component
-
Console Variable Niagara Data Interface
-
Rigid Mesh DI / SM DI move from RequiresDistanceFieldData to RequiresEarlyViewData as mesh distance fields are ready once we have a view to read the data - Rename RequiresDistanceFieldData to RequiresGlobalDistanceField to be more explicit
- Improved sequencer sim caching:
- allow scalability override per cache track
- allow locking of cache tracks to prevent unintentionally overriding a cache asset
- display system name inside cache assets
- disable sequencer looping when recording
-
Heterogeneous Volumes: Basic stereo rendering support (non-ISR)
-
Action menu now autmatically selects an action if only one action is contained. Useful for Niagara Math nodes that have add menus that will only list "Numeric" as addable type
-
Display water body information on Debug HUD - Remove warning that would spam per instance about water body
-
Display Shader Statistics in Niagara Script Stats
-
Allow ribbons to share generated data where possible - CPU will share the generated data across views (i.e. split screen) when opaque or not using multi ribbons - GPU will share across view families in the same frame (i.e. split screen / shadow passes), this is because we don't support multi ribbon sorting on the GPU - Niagara.Ribbon.ShareGeneratedData can be used to enable / disable the optimization
-
Validation rule for ribbon renderer - Allows validation information for using GPU / GPU init as it may not be valid for all platforms
-
Add GPU usage information to ribbon renderer output
-
Correctly support negative UV Scale with SubUV
-
Allow enum inputs in the stack to be displayed as button grid
-
caching 2D render targets #virtualized
-
Mesh Renderer GDME optimization when using MeshIndex / Renderer Vis - While below the cvar controlled instance count look over the mesh index & renderer vis information to determine what meshes are relevant - Because the information is generally hot in cache from copying to GPU buffers, the cost for this is negligible, but can save an entire mesh submit
-
2d cubic interpolation #virtualized
-
Allow Kill Volume Position to be bound to something other than Particles.Position #virtualized
-
Add FNiagaraSimCacheCompare which can be used to compare simulation caches - New comparison allows us to exclude attributes and supply a custom tolerance when comparing caches - Removed the old comparison method from the UNiagaraSimCache
-
Take into account scalability spawn count scaling for Spawn Per Unit #virtualized
-
Heterogeneous Volumes: Apply bounds culling to trim active voxels when computing the lighting cache. #changelist validated #virtualized
-
Heterogeneous Volumes: Accelerating rendering with continuous level-of-detail by applying LODFactor to voxel factors, lighting cache, and volumetric shadow map resolutions. r.HeterogeneousVolumes.CLOD (Default = 1) r.HeterogeneousVolumes.CLOD.Bias (Default = 0)
-
Scripts that have Debug Draw functionality can now additionally define a Debug Draw message that will appear as a tooltip on the Debug Draw toggle on the module.
-
Add FlushComputeAndDeferredQueues to world manager - This wraps some duplicated functionality when manually ticking worlds, like in the baker, etc. - It will flush the compute disatpch queue, optionally wait for GPU to complete, then execute any deferred callbacks
-
'Emitter Properties' are now an item available for Summary View
- Improved data channel ux:
- improved display of variables in asset
- enforce unique variable names in asset
- improved property naming and tooltips in various places
- fixed asset color
- added hyperlink to docs
-
Add a simple object pool & object referencer for Niagara to the World Manager - Users of this pool & referencer are expected to handle recycling / unregistering correctly - Allow clusters to be built for render target data interfaces by moving object referencing into the world manager - Use object pool for render targets so that we can avoid waiting on GC before resources are collected - This reduces a lot of memory usage when scrubbing in the editor / sequencer timelines
-
Add Default Mesh to Skeletal Mesh Data Interface - Unlike the preview mesh the default mesh is not cooked out and can be used in PIE.
-
Heterogeneous Volumes: Prevent SVT streaming request when component is not actively being rendered.
-
Cache GDF information and use when tick flushing - This fixes issues like scrubbing backwards in sequencer with distance field collisions enabled
-
Overload RequiresGameThreadEndOfFrameRecreate for Niagara as we are safe to run async
-
Added parent emitter path to the open parent emitter tooltip on an Emitter node
-
Added sim cache support for data channel writes (the writer data interface calls are persisted in the sim cache and played back when a frame is read).
-
SimCache storage & visualizer for Niagara Arrays
-
Enable high pri cvar for some projects - Clean up the high pri cvar related code
-
Add option to adjust the anim notify progress information based on rate scale, this is disabled for existing content and enabled by default for new content - Add option to apply time dilation to spawned niagara components based on rate scale, disabled by default
-
Niagara MovieRenderQueue plugin - Contains a data interface for inspecting MRQ information
-
Add an option to control occlusion queries for Niagara - Currently it's hard coded to look for custom depth enabled or not, but sometimes you still want occlusion queries to run even though custom depth is enabled
-
Changed default Niagara note contents text to "Title" & "Text" respectively
-
Memory Buffer Data Interface - Allows user to allocate a block of memory to load / store floats & ints however they want
-
New method for allowing particles spawned from NDC to access the NDC element that generated them. New function GetNDCSpawnData(). Returns the NDC index for a particle as well as the total count for that NDC and the spawn index for the current particle inside that NDC spawn. i.e. NDC local Execution Index. Previous SpawnGroup based method still works as a backup where needed. There may be cases where the new method cannot work. For example if a proper Execution Index per NDC is needed.
-
Methods to get the vertex data for a skinned triangle - This is to reduce VVM calls by bundling all data in one function
-
HeterogeneousVolumes: Add option to change compositing order r.HeterogeneousVolumes.Composition Change the order of Heterogeneous Volumes composition (Default = 0) 0: Before Translucency 1: After Translucency
-
Heterogeneous Volumes: Add partial final step to address harsh boundary when intersecting hard surfaces
-
Enable lightweight memory capture by default
-
2 way Coupling supports ellipsoidal shapes add new coupling template #virtualized
-
Basic Niagara Component leak detector - Looks for constant growth in component counts / active components - This will be refined over time and is likely to not catch all cases / produce false positives in some cases
-
Simple Counter SimCache Support - Change test to use sim cache #virtualized
-
Modify visibility display for debug hud to call IsVisible and that can include things like the owner's level collection visibility - Show any active SimCache information on HUD also
-
Allow users to select ribbon material back facing culling vs shape mode
-
Support custom visualizations for data interfaces stored in sim caches * Added visualization for cached data channels
-
SimCache to Json support
-
Emitter & Renderer Count Validation Rules
- Optional data interface comparison for sim cache compare
Bug Fix:
-
Fix for cull proxies and used materials - We need to gather the list from the cull proxy not our controller as it could be different with regards to MIDs, etc - Note: This change does not fix the fact the cull proxies do not map to MIDs correctly
-
Fix for Engine.Emitter.NumParticles & Engine.System.NumParticles not working with GPU emitters - Engine.Emitter.NumParticles will be the GPU count no the GPU count so will be latent
-
Fix for ParticleSubUv material expression working on non-vertex fetch shader profiles when used with Niagara mesh rendererer. The default UV coordinate needs to be reserved on the material in order for the VF to connect the data for rendering
-
When resetting systems be sure to also invalidate the compilation results for child scripts. This ensures deterministic behavior when cooking for platforms that don't require AV data, and makes sure that the resulting editor only data isn't bloated with things like HLSL source code when the data is never going to be used.
-
Made Niagara note header wrappable & reduced max width for note tooltip as it was just too wide
-
Don't detach components when inside non game worlds - Don't call Modify on the attach parent when we detach a Cascade / Niagara component due to system completion - This fixes an issue where levels are being marked dirty if they have one shot FX inside them that play on level load
-
Fix for NPC data interfaces not working - Because NPC DIs do not resolve they were assumed to be internal, this meant they did not flow through the parameter stores correctly.
-
Clean up unnecessary data out of the NiagaraShaderMap DDC payload. Most significantly this removes the FriendlyName as the DDC data can be generated from multiple distinct NiagaraSystems, the name is non-determininistic.
-
Don't allow particle read DI to be a user parameter - It doesn't function, as in you can not change the target emitter
-
Move RapidIterationParameter::DebugName to transient to prevent stale debug names
-
Fix landscape DI for LWC. Supplies tile information for sampling the VT and cached heights as well as corrects the cached height acquisition for large worlds.
-
Fixed average perf stats being wrong when multiple systems are active at the same time
-
Attempt to sanitize symbol name when creating a pin for a customhlsl node
-
Change Neighbor grid to use pixel format capabilities vs volume atomics
-
While active always include the calculated bounds when using auto attachments - This fixes an issue where the effect would no longer be visible due to incorrect bounds if we are attached, become detached (potentially forced via BP) and wish the effect to continue playing
-
Fixed a bug where clicking during a cache recording could cause dropped frames from Slate throttling
-
Fix a crash with main pass scene captures mesh renderers with low latency - Don't build translucent batches for scene captures which perform opaque only draws
-
Fixed missing tooltip for set attributes node when linked to a parameter definition asset * Fixed ui bug in param definition editor
-
Fix for circle occlusion and screen percent changes
-
Fix potential nullptr access in data channel BP node
-
Disabled bHasDeformableMesh for FNiagaraSceneProxy to avoid continuous Virtual Shadow Map invalidation from the primitive bounds.
-
Optimize UNiagaraScript::ComputeVMCompilationId()
-
Fixed issue that preventing pre-culling in some cases when using Auto Attachment.
-
Add braces to the list of characters that are treated as separation tokens for niagara's custom hlsl node processing
-
Fix for GPU ribbons max using the maximum ever allowed vs maximum estimate - This saved a simple GPU ribbon test ~15mb of memory
-
Fixed a bug where renaming a parameter in a module script would in some edge cases not correctly propagate to existing usages
-
Fix fx.NiagaraReleaseBuffersOnReset to allow releasing memory on reset - Currently only GPU buffers will be released on reset, not CPU - Releasing CPU memory reduces component pool usage - In one test run we went from ~4mb -> 1.4mb of particle buffer memory by enabling the early release.
-
Cleaned up logging when exceeding primitive counts with the NiagaraDataInterfaceRigidMeshCollisionQuery
-
Fix transitions for array & simple counter - Cleanup some old code to remove casting
-
Fix for UniqueID being shared incorrectly between spawn groups on the GPU
-
Reset OverrideFormat on return to the pool as some will use RenderTargetFormat vs OverrideFormat
-
ExternalParameter cbuffer is now packed and padded explicitly by the translator to ensure compatibility across all shader platforms.
-
Disable low latency on none surface domain materials - This fixes an issue with volume fog sprites which is rendered before simulations are enabled if they use things like depth buffer reads
-
When converting Color Over Life from Cascade to Niagara, we now correctly select between scaling Particles.Initial.Color and Particles.Color
-
Fixed a bug where new parameter collections were only visible in Niagara systems after an editor restart
-
Fix Niagara landscape DI sampling of RVT to use SRV so that we can properly handle the different texture formats that the data may be stored in (i.e. BC3_UNORM vs BC3_SRGB)
-
Fix for niagara attribute trimmer edge case where we would miss dependencies for the first read of a variable within a stage (in very specific circumstances).
-
LWC fix for sampling SM / SKM without a component - The LWC tile offset was incorrectly applied to the component transform
-
Fixed a bug that prevented users to edit any complex structs in user parameters (e.g. matrices)
-
Fixed an issue with relevance in Niagara where the default material relevance forced us to always render in the depth pass
-
Fix SetEmitterEnabled for GPU & Event Spawns
-
Fixes for rigid mesh DI not correctly setting the MeshScale of Sphere/Capsule bodies
-
Fixed a bug where the context menu in module scripts would show invalid conversion operations for primitive types
-
Fix for Niagara landscape sampling with collision geometry not being properly initialized in game
-
Disable parallel scene proxy creates in Editor - Various other UObjects we might query are unable to run wide during EOF updates because they might invalidate render state
-
Fixes for non-determinism for Niagara scripts. Handles differences between getting the results from an actual compile and pulling hte results from the DDC. In particular -exposed variables are properly applied from the DDC -rapid iteration parameters (including static variables) are now applied all together before SetVMCompilationResults is invoked since it ends pulling data from depenedent scripts -non compilable scripts will now have their rapid iteration parameters (including static variables) to/from the DDC
-
Prevent PostEditChangeProperty from impacting a niagara graph when it's intended for compilation
-
Cleanup source of the referenced compile hashes for Niagara's compilation Id. Because of reordering and non-uniqueness the source strings would be lost and are generally not needed unless someone is using one of the debug options.
-
Couple of fixes for Niagara script compilation -make sure that static variable collection is run nested for emitters -handle shader compilation when threading isn't supported -forward VM backend compiler warnings (typically div/0) back to the log
-
Fixed a bug where recording tracks in subsequences with offset start positions would not play back the correct timeframe.
-
Fixed enum read/write for data channel BP nodes
-
Fix for cleaning up inactive solo systems when they are still holding onto a simulation and the simulation is being changed
-
Set RDG internal access mode on RTs - This fixes an issue when an external RT is used in one pass, set to external access, then used again in another pass
-
Fix for verbose debug rendering of the rigid body DI
-
Change OnSystemComplete delegate to be DuplicateTransient
-
Fix for not generating cutout information on SubImageSize change
-
UE package version incorporated into the DDC data for niagara scripts as we use standard struct/object serialization for the data
-
Make newly created emitter assets inheritable by default
-
Added a fix for inaccurate quaternion interpolation in particle spawn scripts
-
Skel Mesh DI handle the various combinations of 16 bit bones / 16 bit weight & different bone modes
-
Make sure that we only return NPC when we have an initialized world
-
When pulling results from the DDC make sure we properly handle user variables with SWC structs (need to convert them to LWC) in order to mirror what we would have found with a precompile.
-
Speculative fix for crash with nullptr data in async task - Adjust wait code to check for batch task completion at the end of the function to avoid pointer caching - Ensure change to tasks are visible to the game thread
-
Removes ensures from getting triggered when typical graph errors suffice for pushing the informaiton to the user (rather than a potentially long hitch processing the ensure)
-
Provides a fallback path to the parameter map traversal to ensure that we get accurate aliased variables in the history. Without the aliases in place we can miss resetting the chunk cache in the translator which leads to variables leaking between emitters and between the emitter and the system scripts. This was typically seen using a dynamic input in both system and update scripts (Multiply Float).
-
Fix for name collision in the script context for Cascade to Niagara converter. Previously parameters outside the module's namespace could be used instead of the module variable. This allows modules to have input parameters with the same name as parameters in different namespaces.
-
Fixed multiple undo/redo related issues around scratch pad renaming
-
Disable GPU emitters that use FP16 if we do not support typed UAV store / load - fx.Niagara.GpuEmitterCheckFloat16Support can be used to disable this check - Also ensure we flush any pending setting updates each frame
-
Fix for converting Init Mesh Rotation module from Cascade to Niagara, using a new conversion module that takes an Euler rotation, and converts it to a quaternion, and sets particles.rotation.
-
PR #11396: [Niagara] Fixed the problem of repeated recycling of the Resource List #contrib 11396
-
Fixed a crash when using a Data Channel asset without a type set
-
Reset sequencer speed when recording a cache and it's in reverse mode
-
Fix for island type data channel systems being deactivated despite still being used
-
Fix for BP array SetValue calls not updating the GPU copy - Fix various poiints in the array code where we might overwrite the GPU sync incorrectly
-
Update normal extraction from (non VT) landscape with Niagara DI. Not all platforms seem to handle SampleLevel with an explicit index offset, so stole the implementation from the landscape PS using a pair of gathers instead. #virtualized
-
Attribute trimming fix for impure functions not finding all variables that need to be preserved because of Module namespace shenanigans
-
Update constant resolver to include emitter information when stepping through the emitter node to it's subgraph.
-
Fix for ambiguously typed clamp in GetSkinnedTriangleVertexDataHelper
-
PR #9888: Fix use after free in Niagara data interface details
-
Fixed an issue where inputs would not apply entered math expressions correctly
-
Fix an issue where caching Niagara particle in a subsequence would close the root sequence and open the subsequence in isolation
-
Fixed a bug where scratch pads didn't always enable the apply button after a change
-
Fix for Niagara landscape sampling getting the sufficient components when overlapping the system bounds on the landscape
-
Make sure to PostLoad the RendererBindings so that they can be sorted & searchable in cooked builds. Addresses some sporadic issues where static bools used for bindings might not be found and assumed to be false.
-
Fix issue causing changes to an Island NDC's systems to not be applied correctly until editor restart.
-
Reset SKM data interface if the source component is unregistered - Reading from an unregistered skeletal mesh will have no ComponentSpaceTransforms and hit an ensure
-
Saturate the lerp in flight controls - This fixes a potential !finite issue if the lerp could go over 1 and ever increase the float value to be invalid
-
Fix buffer underrun from EVVM - If we output < 4 instance we are writing to memory before the allocation - Data buffers are allocated 16 byte aligned and each component is aligned to 16 bytes so we can therefore just loop until all components are written
-
Fix for invalidating asset when create a new exposed curve texture
-
Fixed issue in which NDCs would not function correctly if used on the same frame they were loaded.
-
Fix for static mesh DI not picking up the right SM when using child blueprints - Add support for mesh parameter binding to SM DI
-
Made several properties on the cached Niagara Script data Transient. This prevents conflicts with deterministic DDC results (DDC-Verify) and reduces the size of our DDC payload substantially (about 50% smaller).
-
Fix for disabling an override from an NPC Instance not being reflected immediately
-
Emitter binding changed to be case insensitive - The unique emitter name is an FString and binding is an FName, the FName can be impacted by the first user so case is not guaranteed
-
Fix race between game / render threads when deciding if rendering was enabled - The render thread was reading from the renderer GT array to determine if rendering was enabled, on proxy recreates this could lead to a race and the system would not render for a frame
-
Pixel Coverage for translucent now uses A rather than RGB - This fixes an issue with particle darkening as pixel coverage kicks in rather than fading out
-
Fix low latency meshes not rendering in shader complexity view modes
-
Update Niagara landscape DI to collect texture resources during a render command from PerInstanceTick instead of during SetShaderParameters and moves SRV parameters over to textures to clean up resource lifetime issues.
-
Disable Niagara ribbons for RayTracing - This is not supported currently as the index buffer can potentially be packed and will cause a GPU hang when used with RT
-
Fixed a crash when editing a data channel asset and compiling a BP with dynamic read/write nodes in it
-
Fix for linking up function inputs when types differ because of SWC/LWC custom structs
-
Fix override parameters not working with cache playback
-
Remove debug only data from Niagara scripts during cook to reduce the size
-
Fix for mesh renderer MeshBoundsScale being unused - Fix for incorrect bounds scaling, it was assuming centered bounds
-
Fix for bad normals on some mesh renderers - Remove normalize from CalcTangentToWorld in mesh particle renderer. This is causing issue with some data from meshes which is invalid (i.e. 0,0,0) and matches what the local vertex factory does. The per particle matrix we transform by is already no scale so the normalize is superfluous
-
Improve attribute trimming when dealing with impure functions in non-expressions
-
Disable auto-save when caching tracks from sequencer
-
Add an option for NiagaraLandscape DI to disable use of VT
-
Early out of updating merged scripts if we're not allowed to compile any shaders. Avoids problems with trying to generate compile ids because we can't access the shader files for hashing
-
Only log lwc reset warning when the system already ticked
-
- Fix cache playback not respecting dataset limit
-
Fixed small issues with the sim cache asset editor
-
Fix for "FX.AllowGPUParticles 0" causing crashes
-
PR #11182: [GAS] Removed ensure that is triggered when a cue plays a particle system that gets preculled #contrib 11182
-
Fix Niagara type registry crash in packaged builds
-
Fix for rare crash with stack footer accessing null StackEditorData
-
Fixed missing comment toggle on new compact style Niagara nodes
-
Fixed issue preventing the Niagara Debug HUD perf graph from displaying GPU performance data. Simple fix. At some point it was just left out of a check to enable the underlying GPUProfiler that generates the stats.
-
Fixed landscape DI function pin to use correct position type (the shader already treated it as lwc position, so just a cosmetic change).
-
- Fix for use after free - Resource names for Niagara must be character arrays not other types of strings, as the internal pool may hold a reference beyond the lifetime of the Niagara data
-
Add bFilterByObjectType option to the RigidMeshCollisionQuery DI to allow people to try what seems to be a more reliable mechanism for controlling which rigid bodies get added to the query.
-
Fix for some attribute bindings not getting renamed properly with emitter merging
-
Handle null rate scale distribution in Cascade converter
-
Fix for baker not capturing anything if the system was already complete
-
Fix for emitter mode approximate motion vectors being incorrect
-
Fix for ParticlePosition previous value being incorrect - To mitigate cost & interpolators we only provide the value for vertex shaders, not pixel shaders - Previous data is also not generated in all cases, it falls back to how it is currently which is previous equals current - Niagara Sprite & Mesh renderers will generate accurate data when motion vectors are set to accurate - Without accurate the results from uising velocity are somewhat mixed
-
LWC fix for Niagara sorting & culling
-
Fix for not updating the GPU sync mode for packaged builds
-
Fix for uniqueness of NPC namespaces
-
Request a compile of the system when handling a change to a user parameter name. Avoids a crash that can happen because of a mismatch between the compiled constant table layouts and the parameter stores.
-
Fix Niagara vector field sampling via ispc supporting masked output (if some of the channels are unused)
-
Cascade to Niagara converter handle nullptr distributions
-
Fixed a bug where undo wouldn't work when deleting a parameter from a module script
-
Fix for emitter sourced mesh rendering using MeshIndex binding
-
Fix array remove on GPU when 0 or max elements
- Fix NaN's poisoning the VVM constant table - Comparing A==B will return true for NaN depending on the FP mode, so we now compare if both values are finite before comparing for equality. - This does not fix the source of the error, but will stop all subsequent float values being set to NaN
Deprecated:
- Deprecated vortex velocity module
Path Tracer
New:
-
Implement Holdout flags for Atmosphere and Exponential Height Fog. This can be used to isolate the contribution of these elements in layered renders.
-
Path Tracer: Build RTPSO for the path tracer during startup to avoid lengthy compilation times the first time the path tracer is selected in the UI
-
Optimize shadow tracing in the path tracer
-
Path Tracer: Implement support for virtual texture feedback
-
Reduce performance impact of decals and volumetrics
-
Skip Distance Field tasks when the path tracer is active
-
Optimize storage of volume intervals in the path tracer
-
Added experimental neural denoising platform (NNEDenoiser) for the Unreal Path Tracer based on the Neural Network Engine (NNE).
-
Path Tracing: Change Indirect Emissive Lighting Component back to its original name. Including this flag as part of the Lighting Components led to some confusion with users as it does not behave quite like the other Lighting Component entries. The original name "Emissive Materials" represents what this setting does more accurately (enable emissive materials to cast indirect lighting into the scene).
Bug Fix:
-
Fixed incorrect rendering of materials that require global distance field when using Path Tracing.
-
SvPosition was not set correctly, leading to inconsistent output from the ScreenPosition material node
-
Avoid path tracer invalidation when a camera is selected in the editor
-
Path Tracer: Fix light functions on directional lights
-
Avoid path tracer invalidation when a DecalActor is selected
-
Hide Path Tracing menu entry on platforms (such as Vulkan) which support raytracing but cannot yet run the path tracer
-
Skip Planar Reflections when path tracing is active
-
Remove passes from Deferred Renderer that are not needed while the path tracer is active
-
Tweak the default ray bias to avoid artifacts in larger scenes
-
Path Tracer: Fix possible NaNs in specular highlights when Anisotropy is set but Tangent is not
-
Avoid cooking errors in decal shaders on platforms which do not support the path tracer
Postprocessing
New:
-
Add tile overlap support to texture indexing mode for neural post processing. Add
Automode toTile sizeto directly tile the screen image without scaling AddBorder Overlapscontrols between each tile to deal with discountinuity. * AddOverlap Resolve Type: 1. Ignore. Overlapped regions are ignored when concatenating tiles. 2. Featherng. Overlapped regions are combined bilinearly - Add neural post processing (experimental).
- Add neural profile to config which neural network to use. Texture index is used by default where [-1,3,H,W] is supported. Use Buffer index to support [-1,C,H,W]. Need to config the batch size override or the tile size correspondingly.
- Config in the post process material of which neural profile to use and enable
used with neural network. - Use neural input/output to control the input and output of the neural network. For neural input, [B,C, U, V] is the index, input0 takes 3 effective channels, mask determines if we should use it as input to the network. Only one node can be used per material; Multiple neural outputs can be used. For texture indexing, automatic bilinear downscaling and upscaling is applied. For Buffer indexing, the user has full control to access the value ( user needs to perform their own filtering).
-
Added support for controlling which regions are considered highlights and shadows using thresholds in Local Exposure.
-
Add support for mobile SSAO at half resolution. This works with SSAO only, and not GTAO. Use "r.Mobile.AmbientOcclusionHalfResolution" to enable.
- Add NNERuntimeRDGHlsl runtime inference support for neural post processing, and catch more errors into log.
Bug Fix:
-
Fixed bloom when local exposure is enabled but bloom threshold is not used.
-
Fix post process ambient occlusion border filtering out of range. Clamp the sampling UV to ViewportMin/Max bounds. Mobile ignores this clamp as it does not use half resolution normals and Downsampled AO created in the setup.
-
Fixed bugs with Post-Process materials that use stencil test when Nanite meshes that render custom depth are visible.
-
Removed clamp from Bloom setup pass which reduced bloom intensity on very bright pixels.
-
Fixed an issue where Variable Rate Shading could crash or behave incorrectly when one split-screen view was within a post-process volume with an after tonemapping post process material, and another was not.
-
Fixed an issue where artifacts would appear in secondary views when using LocalExposure.
-
Fixed artifacts when using Local Exposure.
RHI
New:
-
Enabled support for screen-space (Tier 2) Variable Rate Shading on Xbox Series X.
-
Remove BUF_ImmediateCommit in favor of only having an explicit buffer commit operation
-
Implement support for shrinking reserved resource memory allocations in D3D12 RHI Release backing heaps when they become unreferenced (contain no committed tiles) Use available slack space in the backing heaps before allocating new heaps Track committed / free memory in ReservedResourceData in terms of tiles instead of bytes Add unit test to cover the basic functionality and a few edge cases Perform AddRef() on the heap directly in FD3D12Heap::DeferDelete() instead of requiring caller beforehand Add RHI stat counter for physical memory used by reserved resources
-
Extend D3DX12Residency library to allow making a set of resources resident independently of command list execution * Issue an explicit residency request when updating tile mappings for reserved resources
- Enhanced the D3D12 RHI to handle up to 32 samplers.
- Added a 'RequiredSamplersSwitch' material editor node, allowing branching based on a shader platform's maximum sampler count.
-
Added support for previewing platforms with support for more than 16 samplers. On editor platforms without Dxc and SM6.0 support the preview menu options are disabled.
-
Added MSAA sample count support to canvas render targets.
-
Perform tile mapping updates on the direct queue when the current queue does not support the operation
-
Extend RHI unit tests to cover basic direct and indirect drawing with instance and vertex offsets
-
Implement basic support for D3D12 Reserved Buffers - Add BUF_ReservedResource and BUF_ImmediateCommit, similar to corresponding TexCreate flags - Add GRHIGlobals.ReservedResources.TileSizeInBytes to indicate minimum unit of physical memory that can be mapped to a reserved resource - Add few basic RHI unit tests to exercise new code paths
-
Refactor D3D12 resource residency tracking to allow multiple residency handles per resource. Add reserved resource backing heaps to the residency tracking system.
-
Add bSupportsVertexShaderSRVs to DataDrivenShaderPlatformInfo which drives PLATFORM_SUPPORTS_VERTEX_SHADER_SRVS shader * This should be used to guard any features that require explicitly accessing buffer or textures SRVs in vertex shaders
-
Added support for point list primitive type on PS4
-
Enabled Vulkan LLM in Test configuration
-
Initial implementation of explicit D3D12 reserved buffer commit / resize First pass implementation only supports growing Commit is implemented as a resource transition to allow asynchronous memory mapping operations in the future
-
VulkanRHI: Update to Vulkan SDK 1.3.250.0
- Add support for reserved buffer commit operation to RDG Add QueueCommitReservedBuffer() to FRDGBuilder Add GetCommittedSize() to FRDGPooledBuffer, to query the physical size of the buffer Change ResizeBufferIfNeeded() to issue a commit operation instead of copying when possible Add r.Nanite.Streaming.ReservedResources CVar (default: false) to allocate Nanite ClusterPageData.DataBuffer as a reserved resource of maximum size, which is committed in ResizeBufferIfNeeded() Based on implementation by Zach Bethel.
Bug Fix:
-
Fix HDR on D3D12 for Intel GPUs
-
Wait on GPUFence if provided in RHIMapStagingSurface implementation
-
Fix vulkan validation layers not being included in installed engine builds
-
VulkanRHI: Vulkan fixes for world normals in path tracing and nanite double-sided materials.
-
Fixed memory leak when standalone games are minimized & videos or other apps are creativing active GPU activity.
-
Completely turn off FSR or FDM when the other is available to avoid vulkan validation layers warnings.
-
Fix logic mismatch between FD3D12Adapter::CreateCommittedResource() which calls StartTrackingForResidency() and initialization of bRequiresResidencyTracking in FD3D12Resource()
-
VulkanRHI: Allow the use of AMDBufferMarkers and NVCheckpoints simultaneously (fix crash on drivers that support both).
Deprecated:
- Deprecate DrawIndexedIndirect, since it's just a more confusing version of DrawIndexedPrimitiveIndirect.
Substrate
New:
-
Rename r.Substrate.TileOverflowFromMaterial -> r.Substrate.UseClosureCountFromMaterial and also remove r.Substrate.TileOverflow, as layer count will now be driven by r.Substrate.ClosuresPerPixel when r.Substrate.UseClosureCountFromMaterial=0
-
Make Glint/SpecularLUT/SheenQuality be set per platform.
-
Add Substrate support for Lumen reflection downsample tracing.
-
Added material topology preview on material graph node, colored pin & wire for Substrate data.
-
Expose Substrate MP_FrontMaterial material attribute to make it accessible from Python scripting.
-
Add GBuffer data value picking/visualization.
-
Add Substrate SubstrateConvertMaterialAttributes to ease material attributes setup & manipulation with Subtrate data.
-
Add analytical derivative support for PT and fix Glint support for PT.
-
Change how Lumen integration work with Substrate. This improves Lumen shading reliability with multi BSDF and improves performance.
-
Fix missing specular lighting with rect light when slab having anistropy. Proper GGX anisotropy lighting with rect light is not supported at the moment. In such a case we fallback onto isotropic case.
Bug Fix:
-
Fix NaN when using light transmission with SSS MFP with MFP=0 for certain channel.
-
Fix incorrect specular/diffuse contribution in LumenCards with Substrate. The original code used EnvApprox, which bypass a lot of specular code (e.g., SpecularProfile) and does not respect the diffuse/specular contribution weight. This leads to incorrect hue/appearance in reflection.
-
Fix Substrate env. lighting on mobile renderer.
-
Fix MediaImage / MediaPlate pre-visualization with Substrate.
-
Fix missing SpecularProfile weighting on secondary specular lobe for env. evaluation.
-
Fix complex special tile not being rendered with local light because stencil value was cleared during the stencil based shadow mask computation.
-
Fix fuzz cancelling SSS on material having a single slab.
-
Fix missing SpecularProfile in Lumen reflection.
-
Fix raytraced translucent shadow with Substrate
-
Fix missing contact shadow casting on hair with Substrate.
-
Fix missing subsurface (Profile/Wrap) in Lumen reflection with hit lighting.
-
Fix nDisplay InCameraVFX rendering with Substrate.
-
Fix Lumen Multi-Bounce AO with Substrate.
-
Fix incorrect break, causing complex materials with fuzz to have incorrect transmittance.
-
Fix Substrate with Lumen Reflection only (i.e. without ScreenProbeGather.)
Simulation
Physics
API Change:
- Rotations and velocities in physics particles are now stored in single precision. It was stored previously in double precision. All the API using a returned reference to edit those values are no longer supported. The following functions should used the new API Set_Value_() instead
- TRotation
& R() - TRotation
& Q() - TVector
& V() - TVector
& W() - TVector
& PreV() - TVector
& PreW()
- TRotation
-
In FTransformDynamicCollection in GeometryCollectionProxyData.h all attributes were public, then now are private. Use the new API to access them.
- The Chaos Cache Manager track compression feature is controlled by a console variable and enabled by default (p.Chaos.Cache.CompressTracksAfterRecording)
New:
-
[NetPhysics] Added NetworkPhysicsSettingsComponent as an ActorComponent as a way to set individual settings for networked physics per actor. Currently implements a limited amount of settings for physics replication through Predictive Interpolation and physics Resimulation.
-
Mac: Change the default of Slate.MacMainMenuInsideUnrealWindow to true
-
Chaos Cloth Asset - Added USD Import node.
-
Geometry Collection: Enabled rendering of root proxy meshes when available ( in both editor and game )
-
Cloth Editor Remesher: better handling of open meshes in the Render mesh. Add the option to detect connected boundary vertices that are coincident with another connected set of boundary vertices on another boundary elsewhere. We can then explicitly remesh these "seams" while maintaining a vertex pairing, before then going on to remesh the interior of the mesh islands.
-
Chaos Cloth Asset: - Added a new Cloth Component property to enable the Cloth Asset simulation in editor. - Added simulation controls to the Cloth Component Details panel. - Added a new Cloth Sim section filter at the top of the Cloth Component UI. - Tidied up the Cloth Component categories.
-
Geometry Collection: Optimize data marshalling between physics thread and game thread for geometry collection proxy. This reduces the size of the data to be marshalled as well as the time to process it
-
Add grow, shrink, and flood buttons to the Selection tool
-
Added a Geometry Collection dataflow node for magnet clustering
-
Chaos Cloth Asset - Added a new Proxy Deformer node to the Cloth Asset Dataflow nodes.
-
Added a new cvar (p.Chaos.Convex.UseSimplifierForTConvexHull3Builder) to use a new ConvexHull3-based simplifier in the chaos convex builder, instead of the default simplification; this may give better results in some cases.
-
Added a Geometry Collection dataflow node to create containing cluster nodes for collections w/ isolated root nodes w/ no other transforms.
-
Cloth Editor: focus on tool-defined selection box when user hits 'F', not the entire cloth object
-
[NetPhysics] Implement runtime correction for actors using resimulation while within threshold of not triggering a physics resimulation.
-
Dynamically scale down memory allocation for rewind caching when cache shrinks.
-
[NetPhysics] Allow NetworkPhysicsComponent for physics resimulation to be implemented on AActors instead of only on APawns.
-
Added a warning and progress bar when user attempts to convert a large mesh (>1M tris) to geometry collection
-
Added a dataflow node to get the number of spheres in a sphere covering, to help analyze fracture collision shape generation.
-
Cloth Asset Editor - Removed saving from Dataflow asset creation to match the cloth asset behavior.
-
Implement various physical properties accessor functions on the primitive component in terms of the underlying physics object handle (UPrimitiveComponent::GetPhysicsLinearVelocity, UPrimitiveComponent::GetPhysicsLinearVelocityAtPoint, UPrimitiveComponent::GetAngularVelocityInRadians, and UPrimitiveComponent::GetCenterOfMass).
-
Expose ForceRebuildGTParticleGeometry on cluster unions publicly to allow AddComponentToCluster to optionally not call it immediately so the call can be bulked.
-
Added HashTable implementation for AABBTree payload tracking to reduce memory costs of AABB trees in when used as a local sub-acceleration.
-
Cloth Editor: move Tool buttons to the top toolbar
-
[NetPhysics] Physics replication improvements - Enable time-dilation without using resim to keep client and server physics aligned for better physics replication. - Allow larger replication target alignment, since it will be kept in check via time-dilation. - Allow early out while target has velocity and extrapolate target correctly while performing early-out. - Take receive rate into account for Position and Rotation correction. - Don't send RepMovement from server if using ReplicationCache and the async physics thread has not ticked.
-
Add p.Chaos.DebugDraw.ColorShapesByClusterUnion to be able to differentiate between cluster unions when drawing internal clusters.
-
Geometry collections now set debug name on their GT particles.
-
Cloth Editor layout changes: - Dataflow Graph Editor extends to the left of the editor window - Dataflow Node Details tab is horizontally aligned with the Asset Details and PreviewScene Details - Outliner is in the same tab stack as Dataflow Graph Editor
-
ClothingMeshUtils: if we encounter degenerate triangles during skinning, only do a Slate notification once rather than for each vertex. Multiple slate pop-ups can cause the Editor to become temporarily unusable.
-
Update Chaos::TEventContainer to use a map for storing handlers to optimize unregister calls. When the container has several thousand handlers the linear search is very slow (several MS). Switching to a map increases this significantly. We do lose a bit of speed in DispatchConsumerData as we need to iterate over all the events, but this didn't seem to cause a noticeable regression when profiling.
-
Turn on acceleration structures for cluster union queries.
-
When creating a geometry collection from the fracture editor, suggested name now uses a "GC_" prefix instead of the "_GeometryCollection" postfix to better match Unreal asset naming convention
-
Make FRigidClustering::RemoveParticlesFromCluster and FRigidClustering::AddParticlesToCluster do incremental updates (as much as possible) to the cluster particle's internal strain, cluster group, and physics proxy set instead of needing to re-build these properties from all its children.
-
Add a "secondary selection set" to the Selection Node, Tool, and Facade. This is an optional second set of mesh elements for a given Selection. The intended use case is for operations where the user wants to associate one selection set with another -- for example pairing up Sim Faces and Render Verts for wrap deformer binding.
- [NetPhysics] Predictive Interpolation improvements:
- Perform soft-snap if replication starts going out of sync
- Improved early-out logic
-
Cloth Editor: visualization of seams in 2D and 3D sim views
-
Cluster unions no longer manage their child components' owners' dormancy.
-
Add cvar (p.Chaos.OnlyUseInterclusterEdgesAttachedToMainParticles, default false) to only allow particles directly connected to a cluster union via an intercluster edge to be added/kept in a cluster union.
-
Cloth Editor: when creating a new Dataflow asset, add a Terminal Node by default
-
Geometry collections now emit an event when their particles are fully decayed.
-
Cluster unions will now export their navmesh geometry from their child components.
-
Chaos Cloth Asset: - Fixed missing Cloth Asset package dirty flag whenever the asset is re-updated. - Added a refresh button to the Terminal Node UI to force regenerating the asset when the code but not the data has changed.
-
Expose fully decayed flag on geometry collection components to game systems
-
Chaos Cloth Asset: - Added remap function to the AddWeightMap node. - Fixed property detail view refresh when the node's connections changed. - Deactivate the active tool when a node is invalidated.
-
Geometry Collection: Improved use of cached component space bounds to avoid unnecessary computation
-
[NetPhysics] Various fixes for physics resimulation. - Make sure RewindData is setup before UNetworkPhysicsComponent::CreateDatasHistory is processed. - Use the same history size in UNetworkPhysicsComponent as in RewindData. - Make "Project Settings > Physics > Enable Resimulation" setup RewindData. - Fix issue with time dilation RPC not getting applied on the client. - Fix issue with FPhysicsReplicationAsync::ResimulationReplication not triggering a resimulation due to target TickCount not always being 0 for resimulation targets. - Stop warning logs of "out of rewind data bounds" from printing before the rewind data is populated fully. - Remove / fix various asserts that could trigger during a resimulation due to objects having changed between cached history and current state, for example an object existing currently but not in history which is intended. - Don't allow duplicate or out of order physics replication targets.
- Deprecateed an unused flag from FLinearDriveConstraint.
- Added SetDriveParams to ConstraintInstance to allow the most common changes to be made without needing to make multiple calls and locks. Renamed the FPBDJointConstraintHandle version of this so it matches.
-
Added an AssignPhysicsAsset node to the skel mesh editor subsystem to handle editor scripting of modifying the physics asset for a mesh.
-
Implement shallow copying for Chaos geometry speeding up modifications to geometry and shape arrays on particles.
-
Cloth Weight Map Paint Tool/Node: allow weight map painting on Render vertices. The AddWeightMapNode now stores two sets of vertex weights: one for sim vertices and one for rendering. Changing the view mode while the paint tool is active will load the appropriate weight map from the node. There is also a drop-down selector for choosing which of the two vertex weights should be saved into the ClothCollection (or both.)
-
Improve help text for functions moving actors etc, giving more info about the behaviour when teleport is/isn't used.
-
Updated _ChaosDebugDrawComponent _to render in the Editor world
-
Geometry Collection: Optimized ticking logic on the geometry collection component. Now the component only ticks when there are pieces actively being removed
-
Cloth Editor paint tool: allow brush to get super small. Also fix brush circle not updating after manually setting the brush size property
-
Chaos Cloth Asset Editor: - Added node evaluation progress bars.
-
Cloth Editor: adding two ways to hide/show triangles in the paint tool: - A new HideTriangles brush mode that will hide triangles that are brushed - A new tool property that is a list of Patterns and whether each one is visible or not Limitations: - Hide/show information does not come along when switching between 2D/3D modes - Checkbox interface for selecting which patterns to show is clunky - Manually hiding triangles via brush then unchecking all patterns will clear the manually hidden triangles Also adding an optional white-red mode to visualize the weight map. Painting an all black object in 3D with a dark grey background is pretty annoying.
-
Cloth Editor weight map paint tool: change from triangle painting to vertex painting
-
Expose GetGeometry in the physics object interface.
-
Added the option for Fracture Mode's Autoclustering tool to favor clusters with more convex shapes.
-
Store velocities and rotations in single precision in Physics particles This is saving 80 bytes per particle
-
Added SetCurrentTime blueprint function to Chaos Cache manager/player
-
Geometry collections now track their previously set world transform external so the GT can compute the difference between the two if needed (e.g. if it needs to query the difference prior to the PT->GT sync).
-
Cloth Editor: optional information in the Construction viewport - Numeric mesh stats (so far just triangle/vertex count) - Color-coded cloth patterns
-
Cloth Editor: refresh the Construction view after the Dataflow graph executes. Also rename a member variable from the too-generic "DataflowNode" to "SelectedDataflowNode"
-
Chaos Cloth Asset - Disable the Cloth Asset properties that must be set within the Dataflow graph, to prevent these properties from being accidentally edited inside the Cloth Asset Details panel.
-
Cloth mesh-to-mesh skinning: check that the area of a normal-offset triangle is non-zero before trying to compute barycentric coordinates for it
-
Added a geometry column mode to fracture hierarchy view, which shows triangle and vertex counts, including cumulative counts for cluster nodes
-
Exposed SetUpdateKinematicFromSimulation on Primitive Components to Blueprint
-
FPhysScene_Chaos::HandleGlobalCollisionEvent nonw bubbles up the collision ShapeIndex in cases where we collide against a cluster union
-
Added an option to show in PhAT when a pose violates the joint limits
-
Cloth Editor Weight Map paint tool changes - set default Strength to 1.0 - hook up Q/A hotkeys to cycle through brush modes - hook up W/E hotkeys to adjust Value property
-
Expose enable/disable collision functionality (etc) in the Simulation. Using this provides more reliable collision interactions with the ImmediatePhysics simulation (affects RigidBody and RigidBodyWithControl animation graph nodes).
-
Expose UGeometryCollectionComponent::IsRootBroken publicly.
-
Cloth Selection Tool: add a flood fill deselect action: shift+ctrl+click will deselect all connected mesh elements
-
ClothingMeshUtils: use the same error format for degenerate triangles in both the single-influence and multiple-influence code path
-
Cloth Editor: move the Simulation Visualization panel from drop down menu to its own tab
-
Move cloth editor tool headers to private. Rename ClothEditorToolBuilder to ClothEditorToolBuilders and centralize ToolBuilder classes for the cloth editor
-
Cloth paint tool: add an Invert action to flip paint values. Also, when painting in 2D update any additional 2D vertices that are mapped to the same 3D vertex via welding.
-
Dataflow: highlight "Deprecated" or "Experimental" nodes
-
Geometry Collection are now using a optimized replication logic
-
Cloth selection tool: fix back face material checkerboard
-
Dataflow: Add StaticMeshToCollection node
-
Chaos Debug Draw: Added mass display for kinematic and dynamic particles (p.Chaos.Solver.DebugDrawMass)
-
[NetPhysics] Implement physics resimulation error correction through render interpolation for Cluster Unions and Geometry Collections.
- [NetPhysics] Resim improvements:
- Render interpolation bug fixed as a result of PullData being properly updated in all cases.
- Reduce redundant inputs in each network sync to 3, same default value as the server input buffer.
- Implement resim runtime correction for velocity and angular velocity, guarded by CVar that is disabled by default for now, also implemented as an option int the NetworkPhysicsSettingsComponent
- Implemented replication particle correction that recalculate friction points after an XR correction to make corrections overcome friction.
-
Reduced memory usage of geometry collections.
-
Cloth Editor: make the SkeletalMesh and Animation properties of the Preview Scene persist between editor sessions
-
Cloth Editor: add a "ping pong" mode to the skeletal mesh preview animation playback
-
Cloth Editor Remesh Node: regenerate long-range attachments and self-collision spheres after remeshing. Also remove any other Selections if we remesh.
-
Geometry collections now return false for CanEditSimulatePhysics if no rest collection is set.
-
Add a Remesh node for Cloth. For the sim mesh, the node operates on the 2D representation by first remeshing the seam and boundary edges, then remeshing the entire mesh while constraining those edges. Finally it (un)projects the 2D mesh to 3D using the input 2D/3D mesh representations. For the render mesh, it remeshes the boundaries first, then the interiors in 3D since there are no seams. (Render Mesh LOD generation is likely to be replaced with something more user-controllable in the future, this is kind of a placeholder.) Still TODO: additional constraints for other sim needs
- [NetPhysics] Resim improvements:
- Allow applying closest state on rewind if there is no state for the rewind frame.
- Cache incoming inputs for local player so that the server can alter inputs and have them applied on autonomous proxies during physics resimulation.
- Set a Prediction Interpolation object to resimulation while it interacts with a resim object.
-
[NetPhysics] Functionality for input decay during physics resimulation when there are no more valid inputs.
- [NetPhysics] Resim and replication improvements:
- Implement functionality to find a valid resim frame where all particles in a resim island have a valid target to rewind to.
- Deactivate predictive interpolation logic while particle is in the same island as a resim particle.
-
Chaos Cache Manager: Made observed component component ref accessible from blueprints
-
Chaos Cloth Asset: Added a default template Dataflow asset that appears on all newly created Cloth Assets.
- Geometry Collection: Added bDensityFromPhysicsMaterial to the geometry collection component
- When on, the density set in the rest collection asset will be ignored and the one from the assigned physics material will be used
-
Added an optional transform selection to the Geometry Collection dataflow Flatten node
-
Added a Geometry Collection Dataflow node to clear convex hulls from a selection of bones
-
Cloth Editor preview scene: add a toggle to enable/disable PostProcess Blueprints on the SkeletalMeshComponent
-
Made the Fracture Mode Flatten tool and the corresponding Geometry Collection Dataflow node skip all non-clusters in the selection, rather than converting them to select the parent cluster. This allows one to e.g. select all level 1 nodes and flatten without risk of flattening level 0 if there are leaves on level 1.
- Geometry Collection: Optimized dynamic collection memory
- The immutable MassToLocal attributes have been removed and are now read directly from the asset rest collection This saves 2x96 bytes per bone per geometry collection component instance
-
Adding the ability for Geometry Collections to specify the use of the potentially more expensive collision geometry from the source Static Meshes on the game thread instead of the combined GC collision, when precision is more important than the possible improved performance of the combined GC collision
-
Geometry Collection: Optimized computation of component space transforms ( they are now computed on demand )
-
Made the Fracture Mode's Reset tool into a modal tool, and made "Reset Materials" an option on the tool (rather than trying to guess whether we should reset materials based on material counts)
-
Cluster union initialization now initializes the cluster particle to the component's initial transform and all added particles now have its child to parent set based on their location relative to the cluster union component transform at the time of the addition on the GT.
-
Added additional safeguards to protect against the scenario where the cluster union actor/simulating component replicates after the UClusterUnionReplicatedProxyComponent.
-
[NetPhysics] - Predictive Interpolation replication fixes and improvements - Average out receive rate so that fluctuating send-rate and network conditions doesn't affect replication. - Redesign the angular velocity replication to adjust the target angular velocity based on the angular diff.
-
Geometry Collection: Optimized dynamic collections memory usage by removing deprecated collision related attributes This saves 6 x 4 bytes per bone per geometry collection component instance
- [NetPhysics] Enable physics rewind data capture at runtime if resimulation is used and Project Settings -> Physics -> Physics Prediction is enabled.
- RewindData starts getting captured if either using NetworkPhysicsComponent, EPhysicsReplicationMode::Resimulation on an actor or if manually toggling it by calling FPBDRigidsSolver::EnableRewindCapture().
-
Clarified the Dataflow selection set operations and added a non-symmetric difference op
-
Geometry Collection : Added a "use material damage modifier" option to the GC component. When on, all damage thresholds are multiplied by the damage multiplier property set in the physics material assigned to the component
-
Implement GetComponentVelocity for cluster unions.
-
Add a bReplaceHitWithSubComponents option to collision query params that will let us determine whether or not we hit a cluster union by subtracing into the cluster union but only return the cluster union if it hit
-
Chaos: Add global limit "p.Chaos.Clustering.PerAdvanceBreaksAllowed" to number of processed breaks in BreakingModel for strained particles.
-
Chaos Cloth: - Added a p.ChaosCloth.Solver.MaxVelocity console variable to clamp the relative particles' velocity to the skinned cloth mesh velocity. - Added a p.Chaos.VelocityField.MaxVelocity console variable to clamp the relative particles' velocity to the aerodynamics velocity field. - Added a p.Cloth.MaxVelocityScale console variable to clamp the maximum velocity scale values allowed on all cloth simulations.
-
Cloth - Added a skeletal mesh component velocity scale property to reduce the component induced velocities on all its cloths. This also replaces the bLocalSpaceSimulation property that was used with Chaos Cloth and had been deprecated.
-
Add UClusterUnionComponent::FindChildPhysicsObjectGivenShapeIndex which allows users to query a cluster union to get the underlying physics object given the shape index.
-
Geometry Collection: Added an option to allow Geometry Collection Component transform to follow its root bone (when dynamic)
-
Chaos Cloth: Added simple Self Collision Spheres constraint which is much cheaper than the existing vertex-face self collisions.
-
Cloth Editor Remesh Node: Add a Simplify option for Render mesh decimation. When enabled, this will use FSimplifyMeshOp rather than FRemeshMeshOp. The Simplifier uses QEM to prioritize removing vertices in flat areas to preserve curvature. The result is typically a lower poly count but less uniform mesh than FRemeshOp produces. Because of this, it's only enabled for the Render mesh.
-
Chaos Cloth - Added a global gravity multiplier console variable p.ChaosCloth.GravityMultiplier (default to 1).
-
Add ability for cluster unions to either set or inherit their childrens' gravity group index.
-
Reduce memory usage in Geometry Collection Relative Transform in Dynamic Collection are now in single precision. This change implicates an API change. The Managed Array of transforms being in public, and being changed make some backward compatibility breakage. This array shouldn't have been used much.
-
Geometry Collection: Optimized computation of bounds when the geometry collection is not yet broken
-
Optimized the removal of pending async commands
-
Incremental addition to/removal from cluster union implicit object geometry on both the GT and PT to improve performance.
-
Added simple track compression to Chaos Cache Manager. After recording the track will be compressed using a simple (and fast) compression logic aggregating similar contiguous keys
-
[NetPhysics] Physics replication stuttering fixes when receiving replicated states at unexpected intervals.
-
[NetPhysics] Resimulation Improvements - Runtime correction for rotation improved, faulty calculation fixed and correction not done with pre-resim data. - Don't apply replicated targets during resimulation, only on rewind. - Implemented flow to compare predicted states and inputs with the received server states and inputs to trigger resimulation from discrepancies through NetworkPhysicsComponent.
-
ChaosFlesh: Add Gauss Seidel master constraint
-
Geometry Collection: Add support for masked materials when using Nanite
-
Added a new Cluster Merge to Neighbors dataflow node, allowing selected bones to be independently merged to their nearest or largest neighboring bones/clusters
-
Geometry Collection: reduced memory usage of geometry collection components
- Geometry collections can now specify a collision profile per particle/level that loads the default asset collision profile.
Bug Fix:
-
[NetPhysics] Fix issues with replication target alignment. The fix ensures that SendInterval and ReceiveInterval is calculated and used correctly to align replication targets with and that we start target alignment first after the 3rd valid state is received.
-
Geometry Collection: Fixed issue where collision with a transform were ignored when importing collisions from source
-
Fix crash when deleting selection node while selection tool is active
-
Limit cluster children GT sync to children of dynamic clusters. Kinematic clusters aren't updating non-dynamic children and do not need to force a transform update.
-
Non-GT frozen sim callbacks now also have their SimTime and DeltaTime set properly.
-
Cluster unions should only add themselves into the SQ if they are non-empty (i.e. have a non-zero # of shapes and the shape in the shapes array isn't because of a shape created by an FImplicitObjectUnionClustered).
-
[NetPhysics] Create fake target for predictive interpolation replication on Awake event to stop client from desyncing from server by waking up and simulating freely.
-
Cloth Asset Builder: don't assert if there is not one material per render pattern in the asset, just log a warning. Even though each pattern has a material in the ClothCollection, the user can still remove materials from the asset after the graph evaluates, which can cause this assert to fire when the asset is subsequently loaded.
-
Properly separate geometry collection bone names with "_" between levels to ensure bone names are unique per GC when using auto-clustering.
-
[NetPhysics] Predictive Interpolation replication improvement, align the angular replication timeline with the linear replication timeline. Better replication of off-center rotations.
-
Fix use-after-free in the cluster union manager and ensure that the ImplicitUnion remains valid if the geometry is updated in FClusterUnionManager::FlushIncrementalGeometryOperation.
-
Chaos Cloth Asset - Fixed missing bones when the Cloth Component is used with a higher LOD Skeletal Mesh Component that runs a simplified bone hierarchy.
-
Chaos Cloth Asset - Fixed crash in welding when two consecutive stiches have one end point in common.
-
Cloth Editor: fix for clicking on the same node twice making the sim mesh disappear
-
Fix an issue where clustered particles may not be removed from the StaticClusteredMapArray and KinematicClusteredMapArray arrays when destroyed.
-
Cloth Editor Toolkit: deactivate ClothEditorMode in response to OnClose(), not OnRequestClose(), since editor shutdown can be cancelled after OnRequestClose() is called
-
Server crash on executing async physics command
-
Dataflow: made loop detection more robust when connecting nodes in dataflow
-
Geometry collections no longer set themselves dormant to avoid client/server desync
-
Geometry Collection : Fix inertia tensor and mass computation to support mirroring ( by using a negative scale on one axis )
-
Geometry collection physics proxy now properly sync the particle transform into the dynamic collection.
-
Cloth Editor: don't start the preview animation any time anything changes in the graph
-
Chaos Cloth Asset - Fixed crash when removing a LOD from the Cloth Editor Dataflow while visualizing it.
-
The GC proxy sync is now prevented from doing work if its parent GC component is removed from the scene.
-
UGeometryCollectionComponent::SetSimulatePhysics now goes through the route of recreating the physics state to ensure that the physics state gets destroyed when the component is destroyed.
-
Updates to the geometry collection's particles' shapes collision data on the PT now propagates the information to the cluster union.
-
Fixed an infinite clustering bug in geometry collection's merge neighboring clusters algorithm
-
Fixes for using a fixed timestep with immediate physics (affecting the RigidBody and RigidBodyWithControl animation graph nodes). This is useful for when the frame times can be small (i.e. high frame rates), and adds an option to allow velocities to be rewound along with positions - this ensures that controls/constraints are essentially independent of frame rate when using fixed timesteps.
-
Geometry Collection : Fixed potential crash in FillAutoInstanceMeshesInstancesIfNeeded if the index attribute is not found but the asset has auto instance meshes assigned
-
Chaos Cloth Asset - Fixed the TransferSkinWeight node's weight map name override UI mechanism that wasn't showing the input weight map name when connected.
-
Geometry collections now compute its component space transforms even on the server to prevent desync issues between client/server for character basing.
-
Cloth Editor Preview Scene: manually register skeletal and cloth components instead of calling RegisterAllComponents
-
Geometry Collection : Fixed assert when using nanite masked material
-
Geometry collections now reset their dirty index after calling PushStateOnGameThread or else dirtying that proxy will never cause a GT->PT sync ever again.
-
Chaos Cloth Asset - Fixed crash when evaluating Name output of the AddWeightMap and SelectionToWeightMapNode nodes without evaluating their collection.
-
FPhysScene_Chaos::HandleGlobalCollisionEvent should not try to grab the proxy's body instance if its owning component is no longer valid.
-
Cluster union child to parent update now store which cluster union the update is for to prevent the case where an update forces the particle to go to the wrong location since the child to parent update was for a cluster union it is no longer in.
-
Dataflow - Enable the comment node in the property editor so that the comments' text size and color can now be changed.
-
Strain modifications now happen on all the particles we want to process and not just the top level strained particles.
-
Fix an issue where UWorld::ComponentSweepMulti would return whether there was any hit rather than if there was a blocking hit.
-
Cloth Editor: don't refocus when pressing 'F' if the viewport is empty
-
Fixed a crash in the Fracture Mode's outliner system
-
Geometry collection particles no longer increment sleep/break timers while in a cluster union.
-
Chaos Cloth Editor: fix crash when selecting Comment nodes
-
Cloth Editor Selection Tool: request graph evaluation when leaving selection tool
-
Chaos Cloth Asset - Fixed the module name in ChaosClothAssetToolsModule (was ChaosClothAssetEditor instead of ChaosClothAssetToolsModule).
-
Fix material index mapping when turning multiple cloth collections into LODs for one asset
-
Geometry Collection : Fixed dynamic data replication where root bone position and velocity would be ignored if not part of a cluster union
-
The owner property on per-component data for cluster unions is now set properly.
-
Updating a particle's child to parent in a cluster union now properly propagates that change to the implicit object transform.
-
Geometry collection: Fixed bug where anchored bones were not breaking under strain
-
Fixed event buffer growing unbounded when running in single-threaded modes.
-
Server crash on GeometryCollection when updating RepData due to accessing uninitialized world.
-
Cluster union : when processing damage from contact, find the actual child particle in contact instead of using the one that has the closest center of mass
-
Fix for potentially passing a zero-length normal FindGeometryOpposingNormal in SweepQuery.
-
Fix crash when right clicking a comment node in DataflowGraphEditor
-
Dataflow - Removed ensures that caused errors to nodes whose inputs/outputs had been deprecated and removed, and replaced them with a log message instead.
-
Added mitigation for cases where geometry collections receive out of bounds replication requests for the particle array
-
Cloth - Fixed crash when undoing paint on an unbound clothing data.
-
Fix issue where adding a particle with an existing parent into a cluster union would cause that particle to snap to a different position due to ChildToParent being set too early.
-
Geometry Collection : Fixed race condition when setting some of the geometry collection proxy properties at runtime
-
Alter material fetch during destruction cluster creation to not call GetMaterialData directly as that causes a material array to be allocated.
-
Stopped geometry collection components from spending time updating their body instance inherited from primitive component when updating transforms.
-
Chaos Cloth Asset - Set default MaxDistance weight map to 1 when MaxDistance properties have been set.
-
Fix crash in the AABBTree when potentially accessing a particle with a nullptr debugname.
-
Introduced better cleanup of geometry collections to ensure that they are removed from cluster unions and that they aren't considered for being added into cluster unions in the breaking model.
-
Cluster union syncing now better handles cases where the GC proxy pointer can be almost immediately re-used.
-
Cluster unions now set BodyInstance.OwnerComponent so that it can be registered for collision events.
-
Cloth - Fixed broken camera movement when exiting the cloth painting mode.
-
Geometry Collection : Fixed rest transforms not properly reflected in the viewport when set in a construction script
-
Introduce better particle state management for cluster unions so that it no longer relies on needing to pass Chaos::FPhysicsObjectHandles back and forth from the GT to the PT which would result in the possibility of dead particles still being bookkept by the cluster union
-
Added proper cleanup the cluster union manager's PendingChildToParentUpdates and PendingParticlesToUndoChildToParentLock containers so we don't have garbage pointers lying around in containers that continue to grow uncontrolled
-
Minor optimizations to chaos collision event handling.
-
Cloth Editor: fix crash when reloading Dataflow asset
-
Fix issues where pulling data for the geometry collection from to the PT back to the GT reads old data instead of the latest data.
-
Remove calls to ResetDirtyIdx on the PT to prevent a possible race condition.
-
Cloth Selection Node: check that selection indices are valid for the associated group before adding to the collection
-
Cluster unions now properly reset their geometry to an FImplicitObjectUnionClustered in RemoveParticlesFromClusterUnionGeometry if it ends up empty.
-
Geometry Collection : fixed broken pieces failing to shrink when removal feature was enabled
-
Geometry collections and cluster unions now initialize their kinematic state on the GT if needed.
-
Chaos Cloth Asset - Fixed the bone transforms update when the Cloth Asset's Leader LOD isn't available on the Cloth Asset.
-
Geometry Collection: Physics material will now be properly set if the physics state has been already created
-
Cluster union manager now only prevent adding a particle into a cluster union only if the particle itself is in the cluster union - not caring if the new particle's parents are in the cluster union.
-
Geometry collections now reset their rest transforms just in case they were stored accidentally.
-
Chaos Cache Manager: Fixed potential crash when recording using spawnable
-
[NetPhysics] Physics replication, Predictive Interpolation, to make sure the object goes to sleep and is asleep before stopping the replication else another simulated object can keep the object awake and make it desync from the server.
-
Code specifies TeleportPhysics when moving components through physics replication. This avoids warnings that can appear in USkeletalMeshComponent::MoveComponentImpl when using the default movement method.
-
Chaos - Ensure that collisions disabled using the FMidPhaseModifier are reset to enabled the next frame
-
Geometry collections now reload their collision profiles when the primitive component body instance collision settings change.
-
Reduced memory usage in chaos RewindData.
-
Fix issue where replicated cluster union particles would not accurately account for particles that were removed from the cluster union.
-
Per-particle collision profiles for geometry collections now load correctly on the PT even when there are nullptr particles.
-
Geometry Collection : Fix memory leak when setting the rest state when the scene proxy is not created
-
PR #10735: Fix the order of multiplication of quaternions in
ApplyDeltaToAllPhysicsTransformsin the Skeletal Mesh Component. This affects movement applied to the character through the character movement component. #contrib 10735 -
[NetPhysics] Physics resimulation improvements to rewinding physics when multiple dynamic objects are in contact.
-
Fix potential array out-of-bounds in FClusterUnionManager::HandleRemoveOperation due to duplicate particles in the array of particles to remove.
-
Cluster unions should be unbreakable on the client to help prevent server-client desync.
-
Fixed a failing check when AutoCluster is run but requests zero clusters.
-
Fixed an issue where a geometry collection source would lose its last material.
-
Breaking a geometry collection will now automatically remove from the parent cluster union.
-
[NetPhysics] Fix issue where physics resimulation could get blocked indefinitely
-
Chaos Cloth Asset Editor - Fixed scale reset to 1 on the skin weight transfer tool.
-
Non-blocking traces/overlaps now also trace into cluster unions.
-
Fixed an issue where the Fracture Mode's AutoCluster tool would not cluster when using the ByGrid clustering option.
-
Made the cluster union child to parent replication via the proxy component authoritative so that other sources (e.g. the GC proxy world transform update) don't try to fight that.
-
Improved robustness and behavior of fracture mode when a selected geometry collection is changed by something other than the fracture mode's tools (e.g., by a dataflow graph)
-
Cluster unions now properly remove from the ActorToComponents map even if the actor is no longer valid because it's pending kill.
-
Mac: Fixes to enable groom on M2+ devices. Addresses a hang that was occuring. This is leads to a reduction in hairless nightmare fuel.
-
Handle geometry collection particles being decayed immediately on the physics thread and fix immediately decayed internal geometry collection clusters reporting their children as active.
-
Fixed physics scene pending tasks causing hangs when dispatched during world shutdown
-
Fix handling of kinematics with the write-back from simulation, in particular when using the cvar SyncKinematicOnGameThread
-
Fixed incorrect options in the Fracture Mode 'Set Initial Dynamic State' menus: Added the missing Static options, and removed the Sleeping option.
-
Fixed a crash on redo of any transaction that updated both a Static Mesh's Mesh Description and its convex collision shapes.
Deprecated:
-
PhysXIncludes.h and NvClothIncludes.h will now report a deprecation message if included unncessarily.
- Deprecated COPY_ON_WRITE_ATTRIBUTE and Indirect TManagedArray (use the RestCollection to access those attributes instead)
- Removed CopyOnWriteAttributeList
UI
New:
- Improved text quality by preventing aliasing on glyph quad edges. The difference won't be noticeable in simple cases, but as soon as non axis aligned rotation, scaling, or sub pixel scrolling will occur, the glyphs with content along the edges will look better.
Bug Fix:
-
Add an InitalizeDependency to Enhanced input on the common input subsystem. Since we bind to a delegate on the EI subsystem on Initalize, we need to specify it as a dependency or else it may not be available in a packaged game.
-
Fixed FNullWindow forcing windows to be zero-sized before it was properly initialized
-
Fixed wrong vertical offset on distance field fonts imported as offline on Linux or Mac.
-
-Fixed a possible infinite loop when importing TTF with a specific glyph ranges. -Fixed issue with the FontEditor not refreshing the details view when changing the font cache type.
Slate
API Change:
- SRetainerWidget's Slate argument "RenderWithLocalTransform", as well as cvar Slate.EnableRetainedRenderingWithLocalTransform are deprecated and will be ignored, as they ares no longer necessary (it was a workaround for now fixed transformation issues).
New:
-
Added text block property ApplyLineHeightToBottomLine
-
Adding support for getting and setting the SFilterSearchBox search history text
-
Updated AssetPicker: Filter UI combo button is now created using a common helper method. This fixes the lack of the red dot overlay when filters are active & unifies it with how the Content Browser works - Filter UI combo button placement is now configurable. Maintains old behavior of being placed on the right to the search bar, but can also be placed on the left like the content browser no
-
Added ability for NavigationConfig to modify EUINavigationAction rules
-
Optimization for Slate texture atlas look-ups, resulting in roughly 4x speed-up.
-
Remove check for unscaled view rect non negative, assumption is not correct when accounting for PIE scene view offset.
-
Slat WrapBox now support flow direction.
-
Emit material names for GPU frame captures when drawing in Slate.
-
Added slate argument to SGraphActionMenu to automatically proceed when only one action exists. Defaults to off to save perf. Useful for some Niagara cases.
-
Graph Nodes now have a configurable title border margin; accessible via protected member
-
Added a new text overflow policy: MultilineEllipsis. It behaves similarly to Ellipsis on single line text, but it will ensure that if a line is partially clipped on the vertical axis, it will completely be removed, and the "..." will be shown at the end of the last visible line. It avoids possible issue occurring with multiline text and the Ellipsis mode where the "..." could be invisible because they were displayed in the lower clipped part of the text. #virtualized
-
Added a new option in the Composite Font to enable or disable usage of the Font Face ascent/descent override.
-
Fix slate texture resource crashes on null textures
-
Graph Nodes can now specify what overflow policy to use for the node title
-
Fixed expensive sub-class iteration in UWidget::FindBinderClassForDestination; this method will likely be deprecated in the future.
Bug Fix:
-
Fix ScreenResolution not mapping to viewport in PIE for UI materials / widgets.
-
Update the widget event log to automatically scroll to the bottom, since scrolling it manually will often result in more events being created
-
Fix AnalogCursor mouse move events not properly passing Cursor Index causing issue with mouse capture when using multiple cursors.
-
SSuggestionTextBox now presents the suggestions from the top of the list.
-
PR #10934: Fix RoundedBox SlateBrushes defaulting with an outline radius of (0, 0, 0, 1) #contrib 10934
-
Fix Slate Insights not working due to untracked widget names when using Trace Start / Stop.
-
Fix Slate Frame View not working when opened after insights timeline
-
Fixed issue where cursor lock position would be misaligned after moving window with global invalidation enabled
-
[Retainer] Fixed retainer widget rendering and input issues. Previously, there was a cvar "Slate.EnableRetainedRenderingWithLocalTransform" allowing to choose between 2 render paths, both with different transformation issues. Now there is a single path fixing all transformation problems, and the cvar is deprecated.
-
Fixed SlateTextureAtlas creating free nodes in the empty slot list that have dimensions smaller than what we feasibly expect can be used by glyphs.
-
PR #11088: Slate: Fix custom element shader missing for StandaloneRenderer #contrib 11088
-
Fix New LWCData not populated in slate vertex shaders
-
Fixed an issue when using Preserve Aspect Ratio on an SWindow where the window would change aspect ratio the first time it was resized if it didn't have an OS border/titlebar
-
Fixed slider only moving by one step when bMouseUsesStep is enabled
-
Fixed issue where cvar Slate.ShouldFollowCultureByDefault was ignored.
-
Update Slider widget to use current cursor position instead of previous position
UMG
New:
-
Add framework for processing slate scenebuffer copies --- To create a new slate post buffer processor, inherit from 'USlateRHIPostBufferProcessor' & implement 'PostProcess' To use in game, create a BP that derives from your buffer processor, ex 'USlatePostBufferBlur'. Set default values on that BP, then connect the processor to a buffer in 'SlateRendererSettings'. [REVIEW] patrick.boutot
-
Expose scenebuffers to UMG --- Feature guarded by 'Slate.CopyBackbufferToSlatePostRenderTargets' disabled by default in initial commit. To use simply call GetSlatePost0 material function after enabling CVar. No overhead unless a widget is rendered using the material function, overhead is minimal (Single-copy 0.003 ms). GetSlatePost1-4 require enabling via project settings. [REVIEW] yohann.dossantos jason.nadro #virtualized
-
Add support for layered Slate Post RT processing --- Add PostBufferUpdate widget which can be used to trigger an update to the Slate Post RT when it "draws" Updated Post RT will contain Scene + All UI drawn at that time & also be processed by provided processor. Updated ICustomSlateElement interface to support draw context params.
-
PR #10734: Make CommonUI nicer to use for mouse-based strategy games. #contrib 10734
-
Added BlueprintCallable function AddWidgets to UCommonWidgetGroupBase.
-
PR #11152: [Common UI] Add some root management functions to UCommonUIActionRouterBase #contrib 11152
-
PR #11183: [Common UI] Add the bClearFocusRestorationTargetOfDeactivatedWidgets setting to UCommonActivatableWidgetSwitcher #contrib 11183
-
PR #11150: [Common UI] Add the ability to disable automatic gamepad type detection #contrib 11150
-
PR #11133: Make UCommonActionWidget::UpdateActionWidget virtual PR #11134: CommonUI: Split logic that determines whether the Icon will update in UCommonActionWidget::UpdateActionWidget into its own virtual function PR #11147: Make OnActionProgress and OnActionComplete in UCommonActionWidget virtual #contrib 11133 #contrib 11134 #contrib 11147
- Updated display names for UCommonButtonBase events:
- OnSelectedChangedBase - "On Selected Changed" OnButtonBaseClicked - "On Clicked" OnButtonBaseDoubleClicked - "On Double Clicked" OnButtonBaseHovered - "On Hovered" OnButtonBaseUnhovered - "On Unhovered"
-
Add method to Activatable Widget to clear Focus Restoration Target.
-
Add QueueAnimation methods, which perform better when multiple animation transitions occur in one frame.
-
PR #11192: CommonUI: Add virtual method to CommonAnalogCusor to allow customizing when Left Click should be simulated by Virtual Accept events #contrib 11192
-
PR #10853: CommonUI: Add support for size matching CommonVideoPlayer to media #contrib 10853
-
PR #11209: CommonUI: Make public UCommonUserWidget::(Un)RegisterScrollRecipient functions and expose them to blueprint PR #11212: CommonUI: Fix ScrollRecipients not working if they were registered before the owning widget was constructed PR #11153: [Common UI] Expose FUIActionBindingHandle to blueprints #contrib 11209 #contrib 11212 #contrib 11153
-
PR #10770: Fix CommonBoundActionBar Binding filter not using ignore duplicates #contrib 10770
-
FUIActionBindingHandle: - Added GetDisplayInActionBar and SetDisplayInActionBar functions.
-
PR #10686: Add bIgnoreMoveInput and bIgnoreLookInput to FUIInputConfig equality #contrib 10686
-
UCommonVisibilitySwitcher: - Added bCurrentlySwitching flag, set to true in SetActiveWidgetIndex_Internal. - Added BlueprintPure IsCurrentlySwitching getter.
-
UTextLayoutWidget now properly updates when any of its properties are set directly
- PR #10596: Expose CommonWidgetCarousel MoveSpeed #contrib 10596
Bug Fix:
-
Fix to SetAllowRightClickDragScrolling and IsAllowRightClickDragScrolling to return the right value.
-
Fix CommonUI actions not updating. FActivatableTreeNode::HandleWidgetActivated: - If the path doesn't support activation focus, manually broadcast UCommonUIActionRouterBase::OnBoundActionsUpdated delegate. UCommonUIActionRouterBase::HandleRootNodeActivated: - Still broadcast OnBoundActionsUpdated delegate even if activated root doesn't support activation focus.
-
Correction to CommonUI's GetDesiredFocusTarget to properly used DesiredFocusWidget property correctly when set on the UserWidget.
-
Fix CommonUI actions not updating when widget deactivated. FActivatableTreeNode::HandleWidgetDeactivated: - If the path doesn't support activation focus, manually broadcast UCommonUIActionRouterBase::OnBoundActionsUpdated delegate.
-
Fixed CommonTabListWidgetBase tab registration on design time
-
PR #10817: Fix UCommonActivatableWidgetSwitcher activating the first tab when changing tabs first time #contrib 10817
-
[Retainer] Fixed clipping not working properly if "Stencil" clipping was used on elements inside a retainer (stencil clipping is used when shear or non axis aligned rotation are applied).
-
Fixed a crash in the UMG Designer that could occur when placing widgets in inherited WidgetTrees (when using NamedSlot).
-
Fix rounded border not cropping with translucent materials
-
PR #11238: CommonUI: Fix
UCommonGameViewportClient::HandleRerouteTouchnot getting called #contrib 11238 -
PR #10852: Fix bMatchSize for lazy textures in image widgets in editor #contrib 10852
-
Fixed ImageSize properties not updating correctly when changing Slate Brushes to a texture resource that was currently being streamed in
-
Fixed DataValidator crashing when run on an abstract Blueprint.
-
Fix NamedSlot failing to compile if parent widgets has any BindWidget
-
[CommonUI] Button object now remains consistent after changing sound override properties directly
-
PR #10824: Fix not being able to block input with multiple reasons with UCommonInputSubsystem::SetInputTypeFilter #contrib 10824
-
PR #10838: Deselect buttons when removing them from a UCommonButtonGroupBase #contrib 10838
-
Editor Utility Widgets: Fix to potential crash when trying to open the same Editor Utility Widget more than once using Spawn and Register and Get ID function.
-
UMG: Correction to PanelWidget to prevent a null widget to be added to the panel which could cause a crash in many situation.
-
Improved width calculation in case of multiple leading tabs in text.
-
Common UI: Fix sorting of widgets in the same CommonUI domain.
-
PR #11091: Don't pixel snap screen-space widget components in
SWorldWidgetScreenLayerif the root widget has snapping disabled #contrib 11091 -
PR #10900: Fix not being able to click Common Text widgets in the widget designer when bAutoCollapseWithEmptyText is set to true #contrib 10900
-
Fix brush styles not applying on EUW due to SVG leftover data.
Virtual Production
New:
-
DMX Output Conflict Monitor: Added a conflict monitor for systems that send DMX from engine
-
DMX Pixel Mapping: Added rotation for pixel mapping components
-
DMX Pixel Mapping: Added support for HDR rendering. Select the source and set the Pixel Format to High Precision to enable HDR support
-
DMX Pixel Mapping: Added an option to source to let children follow texture size
-
Experimental support for level instances between -game and editor instances has been added to Multi-user.
-
Enabled editor outlines for Virtual Scouting tools. Editor outlines will now appear around selected objects in the HMD.
-
DMX Pixel Mapping: Added grid snapping
-
Added bPlay property on CineCameraRigRail to toggle play/pause in drive mode
-
DMX Pixel Mapping: Reworked the Layout Menu to reside within the designer
-
DMX Pixel Mapping: Added a context menu to the designer
-
Added bReverse property on CineCameraRigRail to control drive mode direction
-
Add support for meshing networks. When enabled, the a newly discovered node will be shared with existing nodes connected to the UDP layer. This feature has to be enabled via a setting and designed for Multi-user networks where some topology information is pre-shared on switchboard launch. The Switchboard application automatically enables this flag.To manually enable, use the bShareKnownNodesWithActiveConnections setting on the UdpMessaging module. This initial sharing will allow editors to completely mesh together without having to know the editor endpoint id.
-
Only support UE_ADDITIONAL_PLUGIN_PATHS environment variable in editor builds. Game and server builds will not use this variable to lookup additional plugin paths.
-
Added a new Control Rig node to access basic property values by LiveLink subject and property name from any LiveLink Role
-
DMX Pixel Mapping: Added an option to use the patch color as the component color
-
DMX Pixel Mapping: Added an option to flip components of fixture groups horizontally or verically
-
DMX Pixel Mapping: New components now find a reasonable size when first added
Bug Fix:
-
DMX Protocol: Fixed possible race condition when stopping output port threads
-
DMX Pixel Mapping: Fixed matrices do not update when fixture type or patch changed
-
DMX Pixel Mapping: Fixed matrix cells cannot be dragged when not locked in designer
-
DMX Fixtures: Fixed DMX Fixture Component Double to applie its value range correctly when Push Normalized Values Per Attribute is called.
Media IO
New:
-
Added media texture support for overlay materials on media plates.
-
Added depth-aware overlay composite convenience to the media plate contextual menu for minimizing TSR artifacts.
-
LiveLink: Added ability to genlock the engine to a live link subject. This is useful when live link is the primary driver of the animation (such as mocap), but needs to be separate from the timecode source.
Bug Fix:
-
Fix color flashes when changing OCIO config on a blackmagic media source
-
Allow initializing LTC Channel with same Framerate family without multi format mode.
-
Fix stage monitor hitching when receiving data from provider with invalid timecode
-
Improved image media thread safety for shared frames in the global cache.
-
Fixed mip level estimation for media drawn in overlay materials at the post-upscale resolution.
-
Fixed spherical pole artifacts for large tiled EXR sequences.
-
Prevented media thumbnail renderer from filling up the global cache with image media.
-
Fix Media Source OCIO not working with media profiles
-
Fixed crash playing an image sequence with inconsistent resolution.
-
Fix GPU Direct not working with Aja Key&Fill Fix Multiformat 1080p/4k not working, was caused by overlap between the frame buffers. We now index the frames using the biggest gaps possible in case 4K frames are used.
-
MediaIO: Increased default number of buffers from 3 to 4 to avoid starvation. Starvation may happen when anythread scheduling is disabled.
-
Fix media bundle not being able to be placed in level
-
Fixed image media global cache issue where cached empty frames could break playback.
-
Fix MediaIO audio/captions/subtitles not working if source was in JITR mode
-
Rmax: Changed default rate multiplier from 1.05 to 1.00, since the multiplier was upsetting the receiver, and it is not needed anymore.
-
Allow setting aja genlock channel to same output as video
nDisplay
New:
-
Added a new feature to the ICVFX camera component that allows the virtual depth of field rendered to a stage wall to be offset by an amount intended to compensate for the added depth of field from the real world camera when filming the wall. This feature can be enabled through the new Enable Depth of Field Compensation property on the ICVFX camera component. When enabled, the depth of field in the ICVFX image rendered to the stage wall will be offset by a dynamic amount depending on the camera's focus distance, its distance from the wall, and the virtual object's distance from the camera, attempting to compensate for the real world camera's depth of field as much as physically possible
-
Added frustum fitting warp policy and in frustum fit view origin component, which will fit a stage's geometry into either the active engine camera, or an external cine camera if specified, by fitting the projection of the stage geometry onto the camera's projection plane. In addition, users can preview the frustum fit in editor, which will display a preview version of the stage geometry, scaled appropriately, within the camera's frustum in the level
-
Added DC.Stats.Frame console variable to easily display frame number and timecode.
-
nDisplay: Added option to disable overriding transforms (xform, camera, screens) from external config (.ndisplay). Users are encountering two problems: Unexpected behavior when they launch the cluster and the projection is different than expected, and seemingly gets "fixed" when wiggling the NDC via multi-user. Difficulty in sharing the same NDC archetype in multiple levels that have NDC instances with transform overrides in them. Default to disable overrides, because it is the common desired case in VP. Users that dynamically create or modify the .ndisplay and wish those changes to override, should set this new option to true.
-
Switchboard: Sound disabled by default when launching nDisplay Sound is typically not used, and can add unnecessary overhead.
-
Switchboard: Always pick a primary node when launching the cluster. We've seen a common situation where the user launches a subset of the cluster but forgets to assign a primary node. This results in a failed launch but it is not immediately evident why. With this change, this situation should never happen again.
-
nDisplay: Detect when the exported config in the nDisplay asset is out of date. This can happen in child blueprints when their parent changes. It can also happen when there are updates to the export logic.
-
SharedMemoryMedia: Added ability to have multiple simultaneous receivers. Currently limited to 4.
-
Added a new toolbar button to the nDisplay Config Editor to import an MPCDI config into an nDisplay config blueprint, which will add all necessary cluster nodes and viewports, and configure them correctly, as well as adding screen components to match if the MPCDI config is a 2D config.
-
nDisplay: Display device exposure property now affects all materials and not just the techvis material. The property can also be useful to brighten or darken the in-editor preview, especially when preview post process is enabled. Also added a Gamma property, which can be useful when receiving a texture that needs such conversion.
-
SharedMemoryMedia: Added single GPU option so that it can be faster in those cases.
-
nDisplay: Added node name to barrier trace names. Should make it easier to debug. W/o this, one has to look up which node has the ip address that is put in the session name, reducing debugging efficiency, particularly with large clusters.
-
Added a mesh component to the DCRA that stores a 3D version of the stage's geometry map that line traces can be run against to compute distances to the stage's geometry from any point. This mesh can be make visible in the editor using a new property in the stage's Editor Preview properties to allow debugging of the stage's generated geometry map
Bug Fix:
-
nDisplay: Work around annoying LogHAL warning when checking if a named mapped memory already exists.
-
Fixed issue where stage components weren't being outlined when selected in the nDisplay config editor.
-
GpuProfiler: Support gpu trace events named with the
_N pattern, where N is some integer. Before this fix, Gpu trace events with said naming pattern would all appear with the same name, which would correspond to the first one. e.g. VP_0, VP_1, VP_2 would all appear as VP_0 in Unreal Insights. -
nDislplay: Fix inner resolution math when buffer ratio < 1. Issue is that FIntPoint float decays to FIntPoint IntType. So the resolution ended up as zero and media capture start would fail since zero resolution makes it fail.
-
Exposed the "Exposure compensation" property on post process volumes to the ICVFX color grading drawer's property panel
-
SharedMemoryMedia: Fixed inverted alpha when viewing in player. It will invert alpha by default but there is a new option in the Media Output to not invert. Note: GPU time increased up to 100us when alpha inversion is selected on Quadro RTX A6000, for a 4K texture.
-
Fixed issues with light card colors and blending caused by inconsistent gamma encoding for 3D and UV light cards with and without OCIO. Now, all light cards are gamma encoded with gamma 2.2 when rendered, and will be decoded if needed during the final composite pass when blending occurs.
-
nDisplay: Avoid HasFocus related stalls when running the cluster.
-
Added check for IsAlwaysFlushToWall when moving light cards in ICVFX panel, so that they will not be set flush to wall when Flush to Wall is disabled in their properties.
-
Switchboard: Don't include project path in command line when launching cooked nDisplay builds, which was causing it to fail launching.
-
nDisplay: Fixed icvfx camera activation logic when it has media i/o assigned.
-
Fixed issue where light cards moved through DMX were not updated in the ICVFX panel to match their new position
Rendering
New:
-
Added new VP utility post-process volume class, which sets all required settings for pass-through by default.
-
Added a convenience engine material function for color transformations from the sRGB/Rec709 color space to the working color space.
-
Exposed CPU OpenColorIO transformation to color types, and not only images.
-
Allowed OpenColorIO library use in non-editor modes.
-
Updated the OpenColorIO to 2.3.1.
-
Exposed OpenColorIO context on the configuration asset.
Bug Fix:
-
Fixed OpenColorIO scene view extension active references which could prevent its destruction.
-
OpenColorIO transforms are now disabled by default, and avoid skipping rendering on invalid settings.
-
Fixed potential use-after-free in OpenColorIO enqueued render commands.
-
Fixed OpenColorIO reload and rebuild functionality not forcing the operation due to an equivalent cache hash.
-
PanoramicCapture: Fix e.g. C: not recognized as a valid path.
-
Fixed OpenColorIO cache id crash on invalid configs.
Tools
API Change:
- Users launching custom processes via SwitchboardListener may find that, as a result of SwitchboardListener changing from a console subsystem application to a GUI subsystem application on Windows, they now need to explicitly opt into suppressing the console window for child processes, either by passing the newly-added
hide=Trueargument when callingmessage_protocol.create_start_process_message, or equivalently by setting"bHide": truein the corresponding JSON message.
New:
-
[Switchboard] Traffic between Switchboard and SwitchboardListener now utilizes QUIC for transport encryption, and connections to SwitchboardListener require a password (SwitchboardListener 3.0).
-
[Virtual Scouting] The overhauled Virtual Scouting toolset, based on the new XR Creative Framework, is now available as an experimental plugin.
-
[SwitchboardListener] SwitchboardListener is now a Slate application. This provides a more user-friendly workflow for first time setup, and enables users to easily change the authentication password. A separate SwitchboardListenerCmd target is now available for users who still need to build SwitchboardListener as a console application.
-
[Switchboard] Because SwitchboardListener changed from a console application to a GUI application, we now need to set a flag to explicitly hide the console windows of Perforce/UnrealBuildTool child processes that were previously implicitly hidden.
-
[Switchboard] Added a context menu option to exclude individual devices from Unreal Insights tracing.
-
[Switchboard] Simultaneous multithreading (AKA Hyper-Threading) being enabled is now flagged as a warning in the CpuUtilization column of the nDisplay Monitor. These features are known to potentially cause performance hitching with nDisplay workloads.
-
Added support for calibrating lens distortion using aruco patterns to the LensFile editor.
-
[Switchboard] If the user includes the .uproject filename + extension when setting the P4 project path, it will be automatically removed, helping to eliminate a common setup mistake that would otherwise cause Perforce errors that can be difficult to diagnose.
-
Blueprint users can send custom Multi-user RPC events using a new BP API. Blueprint structs can be sent as a custom event and received on a remote client.
-
[XR Creative Framework] The InteractiveToolsFramework SelectionInteraction now ignores any actors/components that the PointerComponent has been configured to ignore.
-
[Switchboard] OSC slate change messages are only sent when text edit loses focus, rather than with each keystroke.
-
[XR Creative Framework] Added blueprint OnUndo / OnRedo delegates to UXRCreativeITFComponent.
-
Made lens distortion solves in the LensFile editor asynchronous, supporting progress messages and a user option to cancel the job before it has finished.
-
[Switchboard] The Switchboard editor settings page now allows access to the "Reinstall Dependencies" option even when the user has not created desktop/start menu shortcuts.
-
Switchboard: Added local cache that can be shared between configs. It caches: Maps in a project Asset types of interest (LiveLink presets, media profiles, nDisplay configs) Also added a progress dialog when finding the maps of a project, and an additional dialog when finding the assets of interest to parse.
-
Bug Fix: [Switchboard] Authentication now works on Linux.
-
A new Live Link Input device plugin has been created to allow users to use gamepad input as a Live Link subject. This feature is only supported on Windows.
-
UPD Messaging module has improved detection of bad socket connections and will automatically filter those connections out from communication. The UDP Messaging module also has additional support for wildcard based IP address filtering to prevent the editor from communicating with designated endpoints.
-
[Concert] Fixed a crash when transacting level instance actor filters.
-
Virtual Production utilities - All properties in the project settings relating to the Legacy Virtual Scouting tools have been placed into the category "Legacy Virtual Scouting".
-
Added a reference implementation to demonstrate one method for writing a lens distortion solver using pytorch and neural networks.
Bug Fix:
-
[Switchboard] Fixed a race condition where FThreadStats could cause a crash on exit.
-
SwitchboardListener: Fix bug where reception is not always disabled until current message is processed.
-
When launching a Multi-user server from the Swithchboard app. The server name is given a unique name based on the primary address for the switchboard config. This provides Multi-user server conflicts when multiple operator stations open the same config.
-
Object Mixer: -Fix: Engine Hitch/Delay when opening Light Mixer
-
Console Variables Editor: -Fix: "Show" Filters Do Not Update Cvar List
-
Switchboard: Fix not selecting the map when creating a new config from Unreal. The issue is that the list of maps being internally listed with the pattern /Game/MyFolder/MyMap.umap/MyMap, instead of just /Game/MyFolder/MyMap, so it never found the entry from the script and was falling back to the default map.
-
Console Variables Editor: -Check for session before sending/receiving MU cvar change
-
Object Mixer -Fix: Removing a Light from a Light Collection does Not Immediately Update UI
-
Level Snapshots: -Fix: Crash when Expanding Media Plates modifications if parameters "AutoPlay, Enable Audio, Play Only when Visible" are changed
-
Object Mixer: -Fix: Blueprint Lights Parameters Switch To "Multiple Values" When Transformed
-
Level Snapshots: -Fix: Crash after restoring Media Plate properties in Level Snapshots when in Multi-User -Fix: Level Snapshots > Crash in results editor UI when expanding VCam actor
-
Console Variables Editor: -Fix: Console Variables Editor does not Execute "HighResShot" more than once when the Execute button is selected.
更新说明
Animation
Movie Render Queue
Upgrade Notes:
- Because the format string tokens for date, time, etc. are now provided in local time instead of UTC time, rendering workflows reliant on UTC will instead need to set it via a scripting pipeline by calling UMoviePipeline::SetInitializationTime with a UTC time.
New:
- The format string tokens for date, time, etc. are now provided in user system (local) time instead of UTC time.
Rigging
Upgrade Notes:
- Older project can still use USkeletalMesh::LoadLODImportedData and SaveLODImportedData. The data will be converted from/to FMeshDescription into the older format. It is recommended to use the newer functions instead, which are modeled on the UStaticMesh API: CommitMeshDescription, GetMeshDescription, etc.
- To construct a FMeshDescription compatible with skeletal meshes, there are helper functions found for this in SkeletalMeshAttributes.h to register attributes for this purpose on a newly created FMeshDescription object.
New:
- Skeletal Mesh LOD import/editable data is now stored using FMeshDescription rather than FSkeletalMeshImportData.
Bug Fix:
- ControlRigXRayMaterial - Updated Xray shader to include eye adaptation so controls don't glow in specific lighting conditions.
Sequencer
Upgrade Notes:
- Movie Render Queue now uses local time for the time related tokens, instead of UTC time. For render farm implementations you can restore the previous UTC behavior by calling UMoviePipeline::SetInitializationTime(FDateTime::UtcNow()) after initializing the pipeline object.
New:
- Movie Render Queue now uses local time for the time related tokens, instead of UTC time.
Synthesis
Upgrade Notes:
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
-
Physics Control Component changes will likely require manual fixups to existing assets, since this is still an experimental plugin.
New:
-
Re-organise the PhysicsControlComponent to remove the private implementation and make it more amenable to extension. Handle missing skeletal mesh component. Fully disable the controls/constraints when strength and damping are zero. Make it possible to set the physics asset in RigidBodyWithControl whilst it is running. Report attempts to use invalid controls etc as warnings (option in the Physics Control Component to enable/disable this). Move ControlSettings into the ControlData struct
-
Removed support for auto-deactivation of physics control component
-
Implemented Physics Control Profiles, which can be used in both PhysicsControlComponent and RigidBodyWithControl.
-
PhysicsControl - support body modifier "default" movement type, so it doesn't force a change to the movement. This fixes problems initialising physics assets that have kinematic bodies.
Editor
Upgrade Notes:
- The default Add Spline Point keyboard shortcut binding has been removed (Previously A-Key). You can re-assign this action in Editor Preferences -> Keyboard
Bug Fix:
- Spline Points will no longer mistakenly be added when moving camera with WASD
Foundation
Upgrade Notes:
- Called when entering and leaving test section.
- ie: For a test named MyTest.Log.Validation.TestTrue These will be called through OnEnteringTestSectionEvent before any test of the corresponding section is executed: - MyTest - MyTest.Log - MyTest.Log.Validation And the corresponding one when leaving the section after execution. One can register a callback this way: FAutomationTestFramework::Get().GetOnEnteringTestSection(TEXT("MyTest.Log")).AddRaw(this, &FMyModule::MySectionCallback); As first argument the name of the section is passed.
New:
- Introduce FAutomationTestFramework::OnEnteringTestSectionEvent, FAutomationTestFramework::OnLeavingTestSectionEvent
Build
Upgrade Notes:
-
Remove unacceptable words. "MasterEnable" has been renamed to "Enable" for MemoryMappedFiles configuration setting.
-
Project Packaging "MovieBlacklist" has been renamed to "MovieDenyList"
New:
-
Remove unacceptable words. "MasterEnable" has been renamed to "Enable" for MemoryMappedFiles configuration setting.
-
Remove unacceptable words. Project Packaging "MovieBlacklist" has been renamed to "MovieDenyList"
Core
Upgrade Notes:
-
If a project has previously relied on modifying Engine/Programs/CrashReportClient/Config/DefaultEngine.ini to set a custom reporting endpoint, this can now be achieved using [Project]/Config/DefaultEngine.ini.
-
CSV Profile output will contain additional data, but overall format remains the same
-
Loading and compiling Blueprint assets in the editor tends to be a bit flimsy. This change should help address assorted issues that we've seen in the past when it comes to preloading Blueprints and their dependencies. If you suspect there's a load-related issue with change, try disabling "linker.EnableFullBlueprintPreloading", and then report the issue on UDN.
-
CSV Profile output will contain additional data, but overall format remains the same
New:
-
Add support for project overrides in crash report client
- Introduces a few changes that enables CrashReportClient to read various settings from project configuration. Also adds compile time defined fallback for report url. This makes it easier to setup third party crash report providers without modifying engine configuration files.
- Some additions to the user interface was also added, for example being able to set company name in some user interface text.
- Finally we also improved memory usage for CrashReportClient on many core machines.
-
Adding 'iris' CSV metadata tag so we can track which builds had it enabled for when we extend playtests outside of dedicated Iris playtests. Flag is set to '1' if the GameNetDriver has "IsUsingIrisReplication" set to true. This logic is done in UNetDriver::PostCreation because doing it inside InitBase is too early on clients, as the PendingNetDriver will not have been set to use Iris yet.
-
Fix loader assumptions for BP objects Added forced flushing of exports for Blueprint classes. Toggle with the "linker.EnableFullBlueprintPreloading" cvar in case any issues arise. When Blueprints and their corresponding classes are compiled, they often need to reference other exports in the package. The expectation is that these exports are fully preloaded prior to compilation, though that's often not the case. Both RegenerateBlueprintClass and RegenerateClass have incomplete logic for preloading the exports, and often miss several, such as portions of the widget tree in a widget Blueprint. Instead of attempting to fix FPreloadMembersHelper to find all dependencies correctly, we can just exploit the fact that nearly all of the exports in a given Blueprint package will be referenced by either the Blueprint or its class. We can just force all of the exports to preload, and avoid having to traipse through object property references to figure out exactly what they reference. While the previous behavior was incorrect, it didn't expose any obvious errors. However, we're trying to ensure that objects are always preloaded prior to postloading, which was often violated during Blueprint compilation.
-
Adding flags to CSV metadata for LTO and PG_Instrumentation so that we know if either feature was turned on during the capture
Framework
Audio
Upgrade Notes:
-
Previously the ability to reverse a FMetasoundGeneratorHandle::WatchOutput was not possible.
-
To use Oculus Audio plugin, retrieve the latest plugin versions directly from the plugin vendor.
-
When you look at your source effects, they will display a warning about having mismatched parameters on your control buses. You'll need to update those Control Buses to use a Volume parameter instead, but even without doing so, they should still function properly.
New:
-
[MetasoundEngine] Provide UnwatchOutput API as inverse of WatchOutput operation.
-
Removed Oculus Audio plugin.
Bug Fix:
- Changed the Chorus Source Effect's Wet/Dry Modulation Parameters to volume (for parity with submix modulators).
Blueprint
Upgrade Notes:
-
This will patch those members back to reference the instance that was created at CDO construction time so that the asset functions correctly in the editor, but it will not restore any non-default values that may have been set prior to when the asset is/was last saved.
-
Re-saving the asset will return the asset to a working state and dismiss the warning on load. If you happen to see it during a save, this is indicative of a problem that will cause data loss.
Bug Fix:
- Added a warning on load/save when Blueprint CDOs contain serialized NULL members that should otherwise be referencing a default subobject instance assigned by the closest native parent class's C++ constructor.
Blueprint Editor
Upgrade Notes:
- The blueprint search metadata schema has been modified so that the exact search can reliably find blueprint function library calls, parent calls and function graphs that override a parent class's function or implement an interface. Currently blueprint search metadata is stored as part of the blueprint asset, so blueprint assets should be loaded and resaved to fully benefit from the updated searchability. Resaving all blueprint assets is not required. The searchability of the asset is then as follows:
- Loaded assets: Fully searchable
- Unloaded and resaved in UE 5.4: Fully searchable
- Unloaded and not resaved: Results may be missing for function library calls, parent function calls, interface implementations and function overriding graphs. Most function call-sites can still be found if it's not from a function library.
- When a project-wide search is performed the Find-in-Blueprints window will show a message when assets were parsed that contain outdated metadata. Options are shown to export the affected asset list or to load all those assets in memory so that they benefit from full searchability. All bulk operations triggered from the Find-in-Blueprints window show a warning message so that the user must confirm the action.The aforementioned option to load all assets with outdated metadata may be unwise when the project is large or if for any reason an asset crashes the editor when loaded. Alternatively, for a small project you may want to bulk resave affected assets. A setting 'Allow Index All Blueprints' has been added under 'Editor Preferences > Blueprint Editor Settings' to disable or enable bulk operations:
- None: Does not allow any bulk load or save operations from the Find-in-Blueprints window.
- Load Only (default): Allows bulk load of assets with outdated metadata.
- Checkout and Save: Allows mass checkout, load and resave of assets with outdated metadata. Setting it via the Editor UI applies it to the current user. The 'Allow Index All Blueprints' can also be set project-wide for all users by creating or modifying the Config/DefaultEditorPerProjectUserSettings.ini file and adding the section:[/Script/BlueprintGraph.BlueprintEditorSettings]AllowIndexAllBlueprints=None | LoadOnly | CheckoutAndResave
New:
-
Find References: Added an exact function search that incorporates the function's class. Previously, Find References on functions would do a raw search by name, yielding irrelevant results like same named functions from other classes and any node that contains the function name as substring. The exact search only finds function call-sites and implementations from the relevant class or interface, including blueprint libraries.
-
Find References for function-related and variable nodes is now a submenu that provides both methods of searching: By Name and By Class Member (new). The keyboard shortcut behaves as before: searching by name for functions and doing an exact search for variables. Note that searching by name is faster than the exact search. The exact search is recommended primarily when searching by name yields many irrelevant results.
Gameplay
API Change:
-
This requires access to the GDK to use.
-
This plugin requires access to the GDK.
-
This means that if you for some reason modified the engine to make XInputInterface.h a publicly available include, you need to add the XInputDevice module as a dependency. This should not be the case for anyone, unless they have customized the engine to extend on XInput and make it public in the first place (It was in a private module folder and not exposed with an API, so we can't really do anything about it if it was modified).
-
Please change the return type of your implementation of RegisterSpecificAsset to return an EDataRegistryRegisterAssetResult.
Upgrade Notes:
-
If you want to process traditional gamepads, you may want to disable XInput to avoid "double reporting" input events.
-
To use this you can simply enable the plugin for your project. To change settings and enable the the processing of devices you can modify your Project Settings.
-
This plugin is defaulted on, so no action should be needed.
-
Please change the return type of your implementation of RegisterSpecificAsset to return an EDataRegistryRegisterAssetResult.
-
No action should be needed, but there are two different virtual functions that you override on UPlayerInput, EvaluateKeyMapState and EvaluateInputDelegates, which may prove helpful if you are extending the existing input system.
-
Because the GameFeatures plugin was moved to Runtime, any PluginTemplates references in the GameFeaturesEditorSettings section of a project's DefaultEditor.ini may need to be updated
-
Added support to set destination reached distance to UAbilityTask_ApplyRootMotionMoveToActorForce.
-
Added support to AbilityTask_ApplyRootMotionMoveToActorForce to target a component with a relative location.
-
Previously, removing a GameplayCue would cause a single EGameplayTagEventType::AnyCountChange callback with its Tag and Count, even though all equivalent Cues would receive an OnRemove. So previously: 15 GC Tags would be a single callback and now it will be 15 callbacks. This will change behavior if you're using something like AbilityTask_WaitGameplayTagCountChanged on the GameplayCue Tag (that callback would fire 15x now, and just once previously). The CVar to toggle this functionality is GameplayCue.Fix.UseEqualTagCountAndRemovalCallbacks (it is now defaulted to true)
-
Previously, it was possible to get Multicast RPC's for Gameplay Abilities on Simulated Proxies (even though none of the data would have been replicated correctly). That's no longer the case -- Simulated Proxies will no longer have Gameplay Abilities replicated to them.
-
This was broken because we did not actually update the InputDeviceId on the input event, only the ControllerId. The fix is to create a new "fake" input device ID and map it to the next available local player if needed for any gamepad events. This has the resulting behavior of te Keyboard and Mouse controlling LocalPlayer[0], and the gamepad controlling LocalPlayer[1], instead of both devices controlling LocalPlayer[0]. In case this somehow caues issues unforeseen issues with split screen games, it can be disabled with the cvar 'input.bRemapDeviceIdForOffsetPlayerGamepadIds'.
-
UCharacterMovementComponent::MoveAutonomous() method got updated and its replication behavior changed, to get previous behavior disabled the EnableQueuedAnimEventsOnServer CVar. Note that now the EnableQueuedAnimEventsOnServer CVar is enabled by default after this change. Older projects that had this CVar disabled will need be enable it to get the new behavior.
New:
-
Game Input Windows experimental plugin.Game Input for Windows is a next-generation input API that exposes input devices of all kinds through a single consistent interface. The goal of Game Input in Unreal Engine is to provide support for as many input devices as possible by default in the engine. This will hopefully enable you as the developer to create some really awesome controls for your game, improving player experience and accessibility "out of the box". Game Input makes supporting "special" input devices such as racing wheels, flight sticks, and instruments easier than it has been in the past in Unreal with solutions like Raw Input. Game Input can also process "traditional" gamepads. For this experimental release the goal of the Game Input Plugin is to have feature parity with the of the existing XInput and Raw Input plugins. This means that you can use it to process gamepads as well as any custom configurations of hardware based on Vendor and Product ID.
-
Add the experimental "Windows Game Input" Plugin. This plugin will allow for the new Game Input library from the GDK to be used on Win64 and WinGDK build targets. In the future, this should allow for improved overall input device support for "special" devices in the future such as racing wheels, flight sticks, etc. Right now, the plugin will essentially have parity with the existing behaviors of Raw Input and XInput on windows.
-
Break XInput out into it's own Input Device module instead of being created as a part of the Windows Application. This will pave the way for us to enable GameInput as the default input device in the future, and make it much easier to just turn off XInput via the plugin system instead of needing to add a bunch of checks to the WindowsApplication.cpp
-
Adding an Enum return value to Register Specific Asset, because if the asset is already registered then we should not log out a warning, which causes Tools to trigger warnings.
-
Refactor the UPlayerInput::ProcessInputStack function to separate out the evaluation of the key map fromt he broadcasting of delegates. This will allow us to change the consumption state of Keys or Delegate bindings from subclasses such as Enhanced Input, which means that we can mark Input Actions to explictly block any legacy key mappings, gameplay debugger keybindings, etc.
-
Move the GameFeatures and ModularGameplay plugins out of Experimental and put them in Runtime. The plugins were changed to Beta in 5.2 but they were not moved at the time
-
Added support to set destination reached distance to UAbilityTask_ApplyRootMotionMoveToActorForce.
-
Added support to AbilityTask_ApplyRootMotionMoveToActorForce to target a component with a relative location.
-
[GAS] PR #11156: Fixed bugs caused by gameplay cue getting removed after OnRemove is sent to the cue
Bug Fix:
-
[GAS] Fixing a longstanding bug that replicated Gameplay Abilities are being replicated to Simulated Proxies (but we expect them to only be replicated to the Owning Client -- Autonomous Proxies).
-
Fix for bSkipAssigningGamepadToFirstPlayer in the GameViewportClient.
-
Fixed issue in CharacterMovementComponent where queued animation notifies were not being fired when running a full animation graph update on server
Networking
Upgrade Notes:
- UNetConnection::ClientHasInitializedLevelFor is now deprecated and UNetConnection::ClientHasInitializedLevel should be used/overridden instead.
New:
- Allow querying whether a client has initialized a level via the ULevel
Learning Resources
Sample Content
Upgrade Notes:
- Levels using BP_SunSky will need to have the VolumetricCloud Actor removed, or the VolumetricCloud component in BP_SunSky disabled, depending on preference.
New:
- Updated SunPosition plugin to add VolumetricCloud component with an updated simple to use and art directable cloud material.
Level Design and Art Tools
Geometry Core
Upgrade Notes:
- New: Provided a new CVar, modeling.DisableAutoUVAreaDensitySampling, which when set, returns the behavior to the original algorithm for UV generation in Patchbuilder, in case there are legacy reasons to maintain that behavior.
New:
- Changed: Improved the UV generation scheme PatchBuilder via a change to the polygroup generation stage, providing area aware sampling of the mesh surface and reducing the overcompensation effects that small, disconnected regions in the mesh were having on the overall segmentation.
Procedural
API Change:
- Added 'abort' capabilities on IPCGElement which allow special behavior when a task is not fully completed before being cancelled.
Upgrade Notes:
-
Any levels with existing, unloaded PCG Partition Actors should be fully loaded and the PCG World Actor should be saved. This will perform a deprecation step that avoids creating duplicate PCG Partition Actors in unloaded grid cells. It is safe to unload the PCG Partition Actors at this point. If these steps were not taken and you have duplicate PCG Partition Actors in some grid cells, you can recover the data by deleting all serialized PCG Partition Actors (Tools -> PCG Framework -> Delete all PCG partition actors), and then regenerating your original PCG components.
-
Previous deprecated nodes will have a Union node emplaced before the Source to respect old behavior
-
The "CancelExecutionOnEmpty" property on PCG Data Collection is deprecated and doesn't do anything anymore.
New:
-
Add support for creating PCG Partition Actors on demand outside of editor, and outside of World Partition levels.
-
Refactored the Difference Node to follow new pattern of looping on the Source pin with an implicit union on the Difference pin.
Bug Fix:
- Improved cancellation behavior, especially in the presence of graph dependencies. Removed the CancelExecutionOnEmpty feature, this was causing problems and is superseded by node culling
UV Editor
Upgrade Notes:
-
Added CVAR modeling.UVEditor.EnableLivePreviewArrangement - Enables or Disables the auto arrangement feature when selecting from the Content Browser. This exists to support legacy behavior where users might want the object's baked in transform to position objects in the UVEditor.
-
Added CVAR modeling.UVEditor.LivePreviewArrangementMode - Selects the mode of the auto arrangement. 0 indicates a line formation. 1 indicates an adaptive circular arrangement.
New:
- Changed: Improved handling of multiple object loading in the UVEditor's 3D viewport. When opening multiple assets from the viewport, relative transforms are preserved. When opening multiple assets from the content browser, automatic arrangement is applied.
World Building
Upgrade Notes:
- In the unlikely event there is C++ code in your project that directly utilizes FWorldPartitionResolveData, please update the code to use FTopLevelAssetPath overloads for improved performance
New:
- Change World Parition Resolve Helper to use FTopLevelAssetPath to avoid unnecessary string manipulation
Localization
Upgrade Notes:
- Don't mount localization data for explicitly loaded plugins by default
- Anything that was calling one of the MountExplicitlyLoadedPlugin functions to load a plugin, will now need to also call MountExplicitlyLoadedPluginLocalizationData if it wants to also mount the localization data.
New:
- Don't mount localization data for explicitly loaded plugins by default
- This allows them to separate their mounting and content loading into two phases, such as allowing a GFP to mount the plugin when 'mounting' and defer mounting the localization data until 'loading'.
- For GFPs specifically, the "GameFeaturePlugin.DeferLocalizationDataLoad" CVar to control whether GFP localization loading has the old (5.3) or new (5.4) behavior.
Online
HTTP
Upgrade Notes:
- This change requires existing holder of FHttpRetrySystem::FManager be converted to shared ptr.
New:
- Make sure it's safe to retry http request in http thread, by keep the shared ptr of retry manager in the request.
Rendering
Upgrade Notes:
- Use r.RayTracing.RequireSM6 to restore previous behavior.
New:
- Disable ray tracing for shader model 5.
Lighting
Upgrade Notes:
-
If the previous behavior for clipmap level selection is desired, set r.Shadow.Virtual.Clipmap.GreedyLevelSelection 1. Adjusting r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias can provide a tradeoff between performance and visual artifacts in scenes with lots of foliage animated with WPO. Note that WPO disable distances must be set on the primitives for it to have any effect.
-
This change brings pages from scene captures and similar systems back into the main VSM physical page pool, so it may be necessary in some of these cases to increase the page pool size to avoid cache thrashing.
-
Old projects that relied on the old behavior can either set the distance scale to a very high value to call no lights to be culled (as before). Alternatively 0 is now a meaningful value if the desire is to cull all lights (with cull distances) at a given scalability setting.
New:
-
Implemented a new system to determine static/dynamic caching per instance for virtual shadow maps based on previous invalidations and WPO behavior. This improves various situations around instanced geometry (commonly foliage) getting transitioned to dynamic caching and never going back.
- Support disabling WPO animation in clipmaps past a certain point (based on the WPO disable distance). This works even when caching/static caching is disabled as it can still be a good performance tool. Related cvars:
- r.Shadow.Virtual.Clipmap.WPODisableDistance: When enabled, disables WPO animation in clipmap levels based on a primitive's WPO disable distance and r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias setting. Default 1 (enabled).
- r.Shadow.Virtual.Clipmap.WPODisableDistance.LodBias: The number of clipmap levels further than the distance that an instance would be animated to allow shadow animation. Typically 2-4 works well but may need to be adjusted for very low light angles with significant WPO movement. Default: 3.
- Add cvar to control greedy clipmap level selection (r.Shadow.Virtual.Clipmap.GreedyLevelSelection); disabled by default. This addresses some old issues around coarse pages getting greedily chosen at certain angles, and also makes the behavior around the new WPO distance disable more predictable.Invalidate instances when the evaluate WPO/WPO distance changes.
- Make virtual shadow map cache more persistent and robust against multiple renders in a single "frame" (scene captures, etc).
Bug Fix:
- Fix bug where setting r.LightMaxDrawDistanceScale to 0 (as is done on Low) would cause local light max draw distance to be ignored. Setting this to 0 now results in all local lights with non-zero cull distances being culled. Adjusted r.LightMaxDrawDistanceScale on default Low scalability to be the same as Medium (0.5). #contrib 10947
Materials and Shaders
Upgrade Notes:
- No changes necessary, but titles for which anti-ghosting is important, consider experimenting with mode 3, to either improve image quality compared to mode 1, or improve performance over mode 2.
New:
- A new TAA mode has been added to r.TemporalAA.Quality, mode 3. This mode has the antialiasing quality of mode 1 coupled with the anti-ghosting of mode 2. The performance is slightly slower than mode 1, but much faster than mode 2, providing a compromise for titles which need the anti-ghosting of mode 2 but with improved performance.
- Existing modes 0, 1, 2 are unchanged.
Nanite
Upgrade Notes:
- Nanite rendering of SplineMeshComponent is now functional and enabled by default. In Unreal Engine 5.3, spline meshes that used a mesh with Nanite enabled would render as non-Nanite using the fallback static mesh. in Unreal Engine 5.4, visual differences may occur with these components. To roll back to previous behavior, configure
r.SplineMesh.RenderNanite=0.
New:
-
Nanite Spline Meshes
-
Added an optimization to bake spline calculations into a look up texture for speed of access.
-
Various Nanite spline mesh cluster culling and rasterization optimizations.
-
Nanite spline meshes are now production-ready and enabled by default.
Niagara
Upgrade Notes:
- Note that this will change the behavior of existing graphs. Moving back to the original implementation would involve a piecewise compare of the elements.
New:
- Fix for vector version of the != operator in Niagara graphs. Previously was returning true only if all components of the vector differed rather than the conventional result of true if any of the vector components differed.
Simulation
Physics
Upgrade Notes:
-
Existing skeletal mesh clothing assets will be upgraded to retain existing behavior by multiplying Fictitious Angular Scale by Subdivision Count, but it will still respect the clamp of [0,2], so it's possible some assets will still change behavior. Chaos Cloth Assets will not be upgraded.
-
Early in UE 5, a bug was introduced that detached skeletal mesh components automatically from their actor when their root body was set to simulate. This change fixes that, so skeletal mesh components will remain attached to their owning actor when parts are set to simulate. It may now be necessary for projects to explicitly detach components rather than just setting them to simulate (for example, when dropping objects that have been picked up). Note that if components are simulating but not detached, then they may "inherit" the movement of the owning actor.
Bug Fix:
-
Chaos Cloth: Fixed Fictitious Angular forces to use the correct scaling with multiple subframes (Subdivision Count).
-
Fixes problems associated with the skeletal mesh component becoming detached from its actor when bodies are set to simulate. This detachment had been introduced early in UE 5, so care should be taken that the fix doesn't cause a regression in projects that were relying on this.