UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SkeletalRenderNanite.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "RenderResource.h"
9#include "ShaderParameters.h"
12#include "GlobalShader.h"
13#include "SkeletalMeshUpdater.h"
19#include "NaniteSceneProxy.h"
20#include "Animation/AnimBank.h"
21
23class UMorphTarget;
25
30class FDynamicSkelMeshObjectDataNanite final : public TSkeletalMeshDynamicData<FDynamicSkelMeshObjectDataNanite>
31{
33 int32 Reset();
34
35public:
36 void Init(
42
43 void Init(
50
51 // Current reference pose to local space transforms
55
60
65
67
68#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
69 // Component space bone transforms
71#endif
72
80
81 // Current LOD for bones being updated
84
85 // Returns the size of memory allocated by render data
87
88private:
89
90 enum class ETransformsToUpdate
91 {
92 Current,
94 };
95
96 void UpdateBonesRemovedByLOD(
97 FSkeletalMeshObjectNanite* MeshObject,
101 ETransformsToUpdate TransformsToUpdate) const;
102};
103
105{
106public:
110
111 virtual void InitResources(const FSkinnedMeshSceneProxyDesc& InMeshDesc) override;
112 virtual void ReleaseResources() override;
113
114 void Update(
118 const TArray<float>& MorphTargetWeights,
119 EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode,
121
123
125
128 virtual TArray<FTransform>* GetComponentSpaceTransforms() const override;
131
132 virtual int32 GetLOD() const override;
133
134 virtual bool HaveValidDynamicData() const override;
135
137
140
141 virtual bool IsNaniteMesh() const override { return true; }
142 virtual const Nanite::FMaterialAudit* GetNaniteMaterials() const override { return &NaniteMaterials; }
143
145
146#if RHI_RAYTRACING
147 FRayTracingGeometry RayTracingGeometry;
148
150
151 // GetRayTracingGeometry()->IsInitialized() is checked as a workaround for UE-92634. FSkeletalMeshSceneProxy's resources may have already been released, but proxy has not removed yet)
152 FRayTracingGeometry* GetRayTracingGeometry() { return RayTracingGeometry.HasValidInitializer() && RayTracingGeometry.IsInitialized() ? & RayTracingGeometry : nullptr; }
153 const FRayTracingGeometry* GetRayTracingGeometry() const { return RayTracingGeometry.HasValidInitializer() && RayTracingGeometry.IsInitialized() ? & RayTracingGeometry : nullptr; }
154
155 virtual int32 GetRayTracingLOD() const override
156 {
157 if (DynamicData)
158 {
159 return DynamicData->RayTracingLODIndex;
160 }
161 else
162 {
163 return 0;
164 }
165 }
166#endif
167
168 inline bool HasValidMaterials() const
169 {
170 return bHasValidMaterials;
171 }
172
174 {
175 if (SkinnedAsset != BonesToRemoveCache.SkinnedAsset || LODIndex != BonesToRemoveCache.LODIndex)
176 {
177 BonesToRemoveCache.SkinnedAsset = SkinnedAsset;
178 BonesToRemoveCache.LODIndex = LODIndex;
179 BonesToRemoveCache.BonesToRemove = SkinnedAsset->GetLODInfo(LODIndex)->BonesToRemove;
180 }
181 return BonesToRemoveCache.BonesToRemove;
182 }
183
184private:
185 FDynamicSkelMeshObjectDataNanite* DynamicData = nullptr;
186
187 void ProcessUpdatedDynamicData(FRHICommandList& RHICmdList, FGPUSkinCache* GPUSkinCache);
188 void UpdateBoneData(FRHICommandList& RHICmdList);
189
190 struct FSkeletalMeshObjectLOD
191 {
193 int32 LODIndex;
194 bool bInitialized;
195
196 // Needed for skin cache update for ray tracing
198 TUniquePtr<FGPUSkinPassthroughVertexFactory> PassthroughVertexFactory;
199
200 FSkinWeightVertexBuffer* MeshObjectWeightBuffer = nullptr;
201
204 , LODIndex(InLOD)
205 , bInitialized(false)
206 {
207 }
208
210 void ReleaseResources();
211 void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize);
212 void UpdateSkinWeights(const FSkelMeshComponentLODInfo* LODInfo);
213 };
214
216
217 FSkeletalMeshUpdateHandle UpdateHandle;
218
219 Nanite::FMaterialAudit NaniteMaterials;
220 bool bHasValidMaterials = false;
221 uint32 LastRayTracingBoneTransformUpdate = INDEX_NONE;
222
223 struct
224 {
225 const USkinnedAsset* SkinnedAsset = nullptr;
228
229 } BonesToRemoveCache; // GameThread Only
230
232};
233
235
237{
238public:
243
244 virtual void InitResources(const FSkinnedMeshSceneProxyDesc& InMeshDesc) override;
245 virtual void ReleaseResources() override;
246
247 virtual void Update(
248 int32 LODIndex,
253 const TArray<float>& MorphTargetWeights,
254 EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode,
256 {}
257
259
260 virtual const FVertexFactory* GetSkinVertexFactory(const FSceneView* View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
261 {
262 return nullptr;
263 }
264
265 virtual const FVertexFactory* GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
266 {
267 check(LODs.IsValidIndex(LODIndex));
268 return &LODs[LODIndex].VertexFactory;
269 }
270
271 virtual TArray<FTransform>* GetComponentSpaceTransforms() const override { return nullptr; }
272
273 virtual TConstArrayView<FMatrix44f> GetReferenceToLocalMatrices() const override { return {}; }
274
275 virtual TConstArrayView<FMatrix44f> GetPrevReferenceToLocalMatrices() const override { return {}; }
276
277 virtual int32 GetLOD() const override { return 0; }
278
279 virtual bool HaveValidDynamicData() const override { return false; }
280
282
284
285 virtual bool IsNaniteMesh() const override { return true; }
286 virtual const Nanite::FMaterialAudit* GetNaniteMaterials() const override { return &NaniteMaterials; }
287
288#if RHI_RAYTRACING
289 // TODO: Support skinning in ray tracing (currently representing with static geometry)
290 virtual const FRayTracingGeometry* GetStaticRayTracingGeometry() const override;
291#endif
292
293private:
294 struct FSkeletalMeshObjectLOD
295 {
297 FLocalVertexFactory VertexFactory;
298 int32 LODIndex;
299 bool bInitialized = false;
300 bool bStaticRayTracingGeometryInitialized = false;
301
303
304 void InitResources(const FSkelMeshComponentLODInfo* InLODInfo);
305 void ReleaseResources();
306 };
307
308 TObjectPtr<UTransformProviderData> TransformProvider;
310 Nanite::FMaterialAudit NaniteMaterials;
311};
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
ESkinVertexFactoryMode
Definition SkeletalMeshTypes.h:51
EPreviousBoneTransformUpdateMode
Definition SkeletalRenderPublic.h:62
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SkeletalRenderNanite.h:31
uint32 BoneTransformFrameNumber
Definition SkeletalRenderNanite.h:73
TArray< FTransform > ComponentSpaceTransforms
Definition SkeletalRenderNanite.h:70
int32 LODIndex
Definition SkeletalRenderNanite.h:82
uint8 bNeedsBoneTransformsPrevious
Definition SkeletalRenderNanite.h:79
uint8 bNeedsBoneTransformsCurrent
Definition SkeletalRenderNanite.h:78
int32 RayTracingLODIndex
Definition SkeletalRenderNanite.h:83
void BuildBoneTransforms(FDynamicSkelMeshObjectDataNanite *PreviousDynamicData)
Definition SkeletalRenderNanite.cpp:128
uint32 RevisionNumber
Definition SkeletalRenderNanite.h:74
EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode
Definition SkeletalRenderNanite.h:76
TArray< FMatrix44f > ReferenceToLocalForRayTracing
Definition SkeletalRenderNanite.h:53
TConstArrayView< FMatrix44f > GetReferenceToLocal() const
Definition SkeletalRenderNanite.h:56
void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize)
Definition SkeletalRenderNanite.cpp:145
bool IsRequiredUpdate() const
Definition SkeletalRenderNanite.h:61
uint32 PreviousRevisionNumber
Definition SkeletalRenderNanite.h:75
TArray< FMatrix44f > ReferenceToLocal
Definition SkeletalRenderNanite.h:52
TArray< FMatrix44f > PreviousReferenceToLocal
Definition SkeletalRenderNanite.h:54
uint8 bRecreating
Definition SkeletalRenderNanite.h:77
Definition GPUSkinCache.h:126
Definition SkeletalRenderNanite.h:237
virtual TArray< FTransform > * GetComponentSpaceTransforms() const override
Definition SkeletalRenderNanite.h:271
virtual TConstArrayView< FMatrix44f > GetReferenceToLocalMatrices() const override
Definition SkeletalRenderNanite.h:273
virtual const FVertexFactory * GetSkinVertexFactory(const FSceneView *View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
Definition SkeletalRenderNanite.h:260
virtual TConstArrayView< FMatrix44f > GetPrevReferenceToLocalMatrices() const override
Definition SkeletalRenderNanite.h:275
virtual int32 GetLOD() const override
Definition SkeletalRenderNanite.h:277
virtual FSkinningSceneExtensionProxy * CreateSceneExtensionProxy(const USkinnedAsset *InSkinnedAsset, bool bAllowScaling) override
Definition SkeletalRenderNanite.cpp:910
virtual void ReleaseResources() override
Definition SkeletalRenderNanite.cpp:888
virtual void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) override
Definition SkeletalRenderNanite.cpp:904
virtual bool HaveValidDynamicData() const override
Definition SkeletalRenderNanite.h:279
virtual const Nanite::FMaterialAudit * GetNaniteMaterials() const override
Definition SkeletalRenderNanite.h:286
virtual void InitResources(const FSkinnedMeshSceneProxyDesc &InMeshDesc) override
Definition SkeletalRenderNanite.cpp:868
virtual bool IsNaniteMesh() const override
Definition SkeletalRenderNanite.h:285
virtual void Update(int32 LODIndex, const FSkinnedMeshSceneProxyDynamicData &InDynamicData, const FPrimitiveSceneProxy *InSceneProxy, const USkinnedAsset *InSkinnedAsset, const FMorphTargetWeightMap &InActiveMorphTargets, const TArray< float > &MorphTargetWeights, EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode, const FExternalMorphWeightData &InExternalMorphWeightData) override
Definition SkeletalRenderNanite.h:247
virtual const FVertexFactory * GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
Definition SkeletalRenderNanite.h:265
virtual void UpdateSkinWeightBuffer(const TArrayView< const FSkelMeshComponentLODInfo > InLODInfo) override
Definition SkeletalRenderNanite.h:283
Definition LocalVertexFactory.h:51
Definition PrimitiveDrawInterface.h:19
Definition PrimitiveSceneProxy.h:296
Definition RHICommandList.h:455
Definition RHICommandList.h:3819
Definition RayTracingGeometry.h:31
bool IsInitialized() const
Definition RenderResource.h:114
Definition SceneView.h:1425
Definition SkeletalMeshLODRenderData.h:128
Definition SkeletalRenderNanite.h:105
virtual void InitResources(const FSkinnedMeshSceneProxyDesc &InMeshDesc) override
Definition SkeletalRenderNanite.cpp:462
void UpdateDynamicData_RenderThread(FRHICommandList &RHICmdList, FGPUSkinCache *GPUSkinCache, FDynamicSkelMeshObjectDataNanite *InDynamicData)
Definition SkeletalRenderNanite.cpp:619
virtual void ReleaseResources() override
Definition SkeletalRenderNanite.cpp:484
virtual ~FSkeletalMeshObjectNanite()
Definition SkeletalRenderNanite.cpp:457
virtual bool IsNaniteMesh() const override
Definition SkeletalRenderNanite.h:141
virtual TConstArrayView< FMatrix44f > GetPrevReferenceToLocalMatrices() const override
Definition SkeletalRenderNanite.cpp:682
bool HasValidMaterials() const
Definition SkeletalRenderNanite.h:168
virtual const FVertexFactory * GetSkinVertexFactory(const FSceneView *View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode=ESkinVertexFactoryMode::Default) const override
Definition SkeletalRenderNanite.cpp:639
virtual TConstArrayView< FMatrix44f > GetReferenceToLocalMatrices() const override
Definition SkeletalRenderNanite.cpp:677
TConstArrayView< FBoneReference > BonesToRemove
Definition SkeletalRenderNanite.h:227
TConstArrayView< FBoneReference > GetCachedBonesToRemove(const USkinnedAsset *SkinnedAsset, int32 LODIndex)
Definition SkeletalRenderNanite.h:173
virtual const Nanite::FMaterialAudit * GetNaniteMaterials() const override
Definition SkeletalRenderNanite.h:142
virtual FSkinWeightVertexBuffer * GetSkinWeightVertexBuffer(int32 LODIndex) const
Definition SkeletalRenderNanite.cpp:832
int32 LODIndex
Definition SkeletalRenderNanite.h:226
const USkinnedAsset * SkinnedAsset
Definition SkeletalRenderNanite.h:225
virtual const FVertexFactory * GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode=ESkinVertexFactoryMode::Default) const override
Definition SkeletalRenderNanite.cpp:651
void UpdateSkinWeightBuffer(USkinnedMeshComponent *InMeshComponent)
Definition SkeletalRenderNanite.cpp:723
virtual bool HaveValidDynamicData() const override
Definition SkeletalRenderNanite.cpp:701
virtual TArray< FTransform > * GetComponentSpaceTransforms() const override
Definition SkeletalRenderNanite.cpp:663
virtual int32 GetLOD() const override
Definition SkeletalRenderNanite.cpp:695
virtual void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) override
Definition SkeletalRenderNanite.cpp:706
Definition SkeletalRenderPublic.h:85
ERHIFeatureLevel::Type FeatureLevel
Definition SkeletalRenderPublic.h:449
TArray< FSkelMeshObjectLODInfo > LODInfo
Definition SkeletalRenderPublic.h:342
Definition SkeletalMeshRenderData.h:17
Definition SkeletalMeshUpdater.h:353
Definition SkeletalRenderNanite.cpp:239
Definition SkinWeightVertexBuffer.h:364
Definition SkinningSceneExtensionProxy.h:17
Definition VertexFactory.h:661
Definition ArrayView.h:139
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
Definition SkeletalMeshUpdater.h:128
Definition SkeletalMeshUpdater.h:209
Definition UniquePtr.h:107
Definition MorphTarget.h:230
Definition SkinnedAsset.h:47
virtual FSkeletalMeshLODInfo * GetLODInfo(int32 Index) PURE_VIRTUAL(USkinnedAsset
Definition SkinnedAsset.h:61
Definition SkinnedMeshComponent.h:258
Type
Definition RHIFeatureLevel.h:20
@ false
Definition radaudio_common.h:23
Definition ExternalMorphSet.h:42
Definition InstancedSkinnedMeshSceneProxyDesc.h:11
Definition ResourceSize.h:31
Definition SkinnedMeshComponent.h:175
TArray< FBoneReference > BonesToRemove
Definition SkinnedAssetCommon.h:171
Definition SkinnedMeshSceneProxyDesc.h:21
Definition SkinnedMeshSceneProxyDesc.h:117
Definition NaniteSceneProxy.h:66
Definition ObjectPtr.h:488