UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SkinningSceneExtension.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"
6#include "SpanAllocator.h"
7#include "Containers/Map.h"
8#include "Containers/Ticker.h"
9#include "SceneExtensions.h"
11#include "SkinningDefinitions.h"
14#include "Matrix3x4.h"
16#include "Delegates/Delegate.h"
17
19
20class FSkinnedSceneProxy;
22{
24
25public:
27 {
29
30 public:
32
33 virtual void End();
34 virtual void PreSceneUpdate(FRDGBuilder& GraphBuilder, const FScenePreUpdateChangeSet& ChangeSet, FSceneUniformBuffer& SceneUniforms) override;
35 virtual void PostSceneUpdate(FRDGBuilder& GraphBuilder, const FScenePostUpdateChangeSet& ChangeSet) override;
36
38
39 private:
40 FSkinningSceneExtension* SceneData = nullptr;
44 const bool bEnableAsync = true;
45 bool bForceFullUpload = false;
46 bool bDefragging = false;
47 };
48
50 {
52
53 public:
55
56 virtual void UpdateViewData(FRDGBuilder& GraphBuilder, const FRendererViewDataManager& ViewDataManager) override;
57
58 virtual void UpdateSceneUniformBuffer(FRDGBuilder& GraphBuilder, FSceneUniformBuffer& Buffer) override;
59
60 private:
61 FSkinningSceneExtension* SceneData = nullptr;
62 };
63
64 friend class FUpdater;
65
67
70
71 virtual void InitExtension(FScene& InScene) override;
72
73 virtual ISceneExtensionUpdater* CreateUpdater() override;
75
77
80
81private:
82 enum ETask : uint32
83 {
84 FreeBufferSpaceTask,
85 InitHeaderDataTask,
86 AllocBufferSpaceTask,
87 UploadHeaderDataTask,
88 UploadHierarchyDataTask,
89 UploadTransformDataTask,
90
91 NumTasks
92 };
93
94 struct FHeaderData
95 {
96 FPrimitiveSceneInfo* PrimitiveSceneInfo = nullptr;
97 FSkinningSceneExtensionProxy* Proxy = nullptr;
98 FGuid ProviderId;
99 uint32 InstanceSceneDataOffset = 0;
100 uint32 NumInstanceSceneDataEntries = 0;
101 uint32 ObjectSpaceBufferOffset = INDEX_NONE;
102 uint32 ObjectSpaceBufferCount = 0;
103 uint32 HierarchyBufferOffset = INDEX_NONE;
104 uint32 HierarchyBufferCount = 0;
105 uint32 TransformBufferOffset = INDEX_NONE;
106 uint32 TransformBufferCount = 0;
107 uint16 MaxTransformCount = 0;
108 uint16 MaxHierarchyCount = 0;
109 uint16 MaxObjectSpaceCount = 0;
110 uint8 MaxInfluenceCount = 0;
111 uint8 UniqueAnimationCount = 1;
112 uint8 bHasScale : 1 = false;
113 uint8 bIsBatched : 1 = false;
114
115 FSkinningHeader Pack() const
116 {
117 // Verify that values all fit within the encoded range prior to packing
118 check(
119 HierarchyBufferOffset <= SKINNING_BUFFER_OFFSET_MAX &&
120 TransformBufferOffset <= SKINNING_BUFFER_OFFSET_MAX &&
121 (ObjectSpaceBufferOffset == INDEX_NONE || ObjectSpaceBufferOffset <= SKINNING_BUFFER_OFFSET_MAX) &&
122 MaxInfluenceCount <= SKINNING_BUFFER_INFLUENCE_MAX
123 );
124
126 Output.HierarchyBufferOffset = HierarchyBufferOffset;
127 Output.TransformBufferOffset = TransformBufferOffset;
128 Output.ObjectSpaceBufferOffset = ObjectSpaceBufferOffset != INDEX_NONE ? ObjectSpaceBufferOffset : 0;
129 Output.MaxTransformCount = MaxTransformCount;
130 Output.MaxInfluenceCount = MaxInfluenceCount;
131 Output.UniqueAnimationCount = UniqueAnimationCount;
132 Output.bHasScale = bHasScale;
133 return Output;
134 }
135 };
136
137 class FBuffers
138 {
139 public:
140 FBuffers();
141
143 TPersistentByteAddressBuffer<uint32> BoneHierarchyBuffer;
144 TPersistentByteAddressBuffer<float> BoneObjectSpaceBuffer;
146 };
147
148 class FUploader
149 {
150 public:
152 TByteAddressBufferScatterUploader<uint32> BoneHierarchyUploader;
153 TByteAddressBufferScatterUploader<float> BoneObjectSpaceUploader;
155 };
156
157 bool IsEnabled() const { return Buffers.IsValid(); }
158 void SetEnabled(bool bEnabled);
159 void SyncAllTasks() const { UE::Tasks::Wait(TaskHandles); }
160
161 void FinishSkinningBufferUpload(
162 FRDGBuilder& GraphBuilder,
164 );
165
166 void PerformSkinning(
167 FSkinningSceneParameters& Parameters,
168 FRDGBuilder& GraphBuilder
169 );
170
171 bool ProcessBufferDefragmentation();
172
173 UWorld* GetWorld() const;
174
175 // Wait for tasks that modify HeaderData - after this the size and main fields do not change.
176 void WaitForHeaderDataUpdateTasks() const;
177
178private:
179 FSpanAllocator ObjectSpaceAllocator;
180 FSpanAllocator HierarchyAllocator;
181 FSpanAllocator TransformAllocator;
182 TSparseArray<FHeaderData> HeaderData;
183 TSet<int32> HeaderDataIndices;
185 TUniquePtr<FBuffers> Buffers;
186 TUniquePtr<FUploader> Uploader;
188
189 bool Tick(float DeltaTime);
190
191 struct FTickState : public FRefCountBase
192 {
193 float DeltaTime = 0.0f;
194 FVector CameraLocation = FVector::ZeroVector;
195 };
196
197 TRefCountPtr<FTickState> TickState{ new FTickState };
198 FTSTicker::FDelegateHandle UpdateTimerHandle;
199
200 TWeakObjectPtr<UWorld> WorldRef;
201
202public:
205};
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_SCENE_EXTENSION_UPDATER(ClassName, SceneExtensionClassName)
Definition SceneExtensions.h:390
#define DECLARE_SCENE_EXTENSION_RENDERER(ClassName, SceneExtensionClassName)
Definition SceneExtensions.h:394
#define DECLARE_SCENE_EXTENSION(ModuleExport, ClassName)
Definition SceneExtensions.h:384
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition PrimitiveSceneInfo.h:266
Definition RenderGraphBuilder.h:49
Definition RefCounting.h:213
Definition ViewData.h:64
Definition ScenePrimitiveUpdates.h:129
Definition ScenePrimitiveUpdates.h:116
Definition SceneRendering.h:2023
Definition SceneUniformBuffer.h:137
Definition ScenePrivate.h:2875
Definition SkinningSceneExtensionProxy.h:17
Definition SkinningSceneExtension.h:50
FRenderer(FSceneRendererBase &InSceneRenderer, FSkinningSceneExtension &InSceneData)
Definition SkinningSceneExtension.h:54
virtual void UpdateViewData(FRDGBuilder &GraphBuilder, const FRendererViewDataManager &ViewDataManager) override
Definition SkinningSceneExtension.cpp:1294
virtual void UpdateSceneUniformBuffer(FRDGBuilder &GraphBuilder, FSceneUniformBuffer &Buffer) override
Definition SkinningSceneExtension.cpp:1351
Definition SkinningSceneExtension.h:27
virtual void End()
Definition SkinningSceneExtension.cpp:668
virtual void PostSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePostUpdateChangeSet &ChangeSet) override
Definition SkinningSceneExtension.cpp:742
virtual void PreSceneUpdate(FRDGBuilder &GraphBuilder, const FScenePreUpdateChangeSet &ChangeSet, FSceneUniformBuffer &SceneUniforms) override
Definition SkinningSceneExtension.cpp:675
void PostMeshUpdate(FRDGBuilder &GraphBuilder, const TConstArrayView< FPrimitiveSceneInfo * > &SceneInfosWithStaticDrawListUpdate)
Definition SkinningSceneExtension.cpp:820
Definition SkinningSceneExtension.h:22
static RENDERER_API const FSkinningTransformProvider::FProviderId & GetAnimRuntimeProviderId()
Definition SkinningSceneExtension.cpp:1386
virtual void InitExtension(FScene &InScene) override
Definition SkinningSceneExtension.cpp:179
static RENDERER_API void ProvideAnimRuntimeTransforms(FSkinningTransformProvider::FProviderContext &Context)
Definition SkinningSceneExtension.cpp:1476
static RENDERER_API const FSkinningTransformProvider::FProviderId & GetRefPoseProviderId()
Definition SkinningSceneExtension.cpp:1381
virtual ISceneExtensionUpdater * CreateUpdater() override
Definition SkinningSceneExtension.cpp:205
virtual ~FSkinningSceneExtension()
Definition SkinningSceneExtension.cpp:174
static bool ShouldCreateExtension(FScene &InScene)
Definition SkinningSceneExtension.cpp:158
RENDERER_API void GetSkinnedPrimitives(TArray< FPrimitiveSceneInfo * > &OutPrimitives) const
Definition SkinningSceneExtension.cpp:1361
static RENDERER_API void ProvideRefPoseTransforms(FSkinningTransformProvider::FProviderContext &Context)
Definition SkinningSceneExtension.cpp:1391
virtual ISceneExtensionRenderer * CreateRenderer(FSceneRendererBase &InSceneRenderer, const FEngineShowFlags &EngineShowFlags) override
Definition SkinningSceneExtension.cpp:210
Definition SpanAllocator.h:15
Definition SceneExtensions.h:69
Definition SceneExtensions.h:45
Definition SceneExtensions.h:24
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition RefCounting.h:454
Definition SparseArray.h:524
Definition StaticArray.h:26
Definition UniquePtr.h:107
bool IsValid() const
Definition UniquePtr.h:280
Definition World.h:918
bool Wait(const TaskCollectionType &Tasks, FTimespan InTimeout=FTimespan::MaxValue())
Definition Task.h:381
Definition ShowFlags.h:56
Definition Guid.h:109
Definition SkinningTransformProvider.h:81
Definition WeakObjectPtrTemplates.h:25
static CORE_API const TVector< double > ZeroVector
Definition Vector.h:79