UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SkinWeightProfile.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "BoneIndices.h"
7#include "RHIGPUReadback.h"
9#include "RenderingThread.h"
10#include "String/Join.h"
11#include "Templates/UniquePtr.h"
12#include "UObject/NameTypes.h"
14
15#include "SkinWeightProfile.generated.h"
16
17class USkeletalMesh;
19
21{
22 struct FVertInfluence;
23}
24
28
32
34USTRUCT()
36{
38
39
40 UPROPERTY(EditAnywhere, Category = SkinWeights)
42
44 UPROPERTY(EditAnywhere, Category = SkinWeights)
45 FPerPlatformBool DefaultProfile;
46
48 UPROPERTY(EditAnywhere, Category = SkinWeights, meta=(EditCondition="DefaultProfile", ClampMin=0, DisplayName = "Default Profile from LOD Index"))
49 FPerPlatformInt DefaultProfileFromLODIndex;
50
51#if WITH_EDITORONLY_DATA
52 UPROPERTY(VisibleAnywhere, Category = SkinWeights)
54#endif
55};
56
57#if WITH_EDITORONLY_DATA
58
60struct FRawSkinWeight
61{
62 // MAX_TOTAL_INFLUENCES for now
64 uint16 InfluenceWeights[MAX_TOTAL_INFLUENCES];
65
67};
68
71{
73
74 //This is the result of the imported data before the chunking
75 //We use this data every time we need to re-chunk the skeletal mesh
77
79};
80
81#endif // WITH_EDITORONLY_DATA
82
119
128
133{
134 static constexpr int32 MaxLayerCount = 2;
136
140
141 // A fancy way of specifying a function with FName argument count between 1 and MaxLayerCount
142 template <
143 typename... ArgTypes
144 UE_REQUIRES((sizeof...(ArgTypes) > 0 && sizeof...(ArgTypes) <= MaxLayerCount) && UE::Core::Private::TCanBeConvertedToFromAll_V<FName, ArgTypes...>)
145 >
147 : Layers{Forward<ArgTypes>(Args)...}
148 {
149 // Make sure that we mark any remaining elements are NAME_None to avoid corrupted names.
150 for (int32 LayerIndex = sizeof...(ArgTypes); LayerIndex < MaxLayerCount; ++LayerIndex)
151 {
152 Layers[LayerIndex] = NAME_None;
153 }
154 }
155
157 {
158 for (int32 LayerIndex = 0; LayerIndex < MaxLayerCount; ++LayerIndex)
159 {
160 Layers[LayerIndex] = InProfileNames[LayerIndex];
161 }
162 }
163
165 {
166 return Layers == InProfileStack.Layers;
167 }
169 {
170 return Layers != InProfileStack.Layers;
171 }
172
174 {
175 return Layers[InLayerIndex];
176 }
177
182
183 bool IsEmpty() const
184 {
185 for (int32 LayerIndex = 0; LayerIndex < MaxLayerCount; ++LayerIndex)
186 {
187 if (!Layers[LayerIndex].IsNone())
188 {
189 return false;
190 }
191 }
192 return true;
193 }
194
196 {
197 for (int32 LayerIndex = 0; LayerIndex < MaxLayerCount; ++LayerIndex)
198 {
199 OutProfileNames[LayerIndex] = Layers[LayerIndex];
200 }
201 }
202
205 {
207
209 {
210 if (!Layers[ReadLayer].IsNone())
211 {
213 }
214 }
215 return NormalizedLayers;
216 }
217
218 FString GetUniqueId() const
219 {
221 return IdString.ToString();
222 }
223
225 {
226 uint32 Hash = 0;
227 for (int32 LayerIndex = 0; LayerIndex < MaxLayerCount; ++LayerIndex)
228 {
230 }
231 return Hash;
232 }
233};
234
235
238{
240
242
245
246#if !WITH_EDITOR
247 // Mark this as non-editor only to prevent mishaps from users
249#endif
253 FSkinWeightVertexBuffer* GetDefaultOverrideBuffer() const { return DefaultOverrideSkinWeightBuffer; }
254
255 // Buffer lookup for layered profiles.
258
259 // Lookups for individual profiles.
260 ENGINE_API bool ContainsProfile(const FName& ProfileName) const;
261 ENGINE_API const FRuntimeSkinWeightProfileData* GetOverrideData(const FName& ProfileName) const;
263
265
268
269 friend FArchive& operator<<(FArchive& Ar, FSkinWeightProfilesData& OverrideData);
270
272
274
276
279
280 bool IsDefaultOverridden() const { return bDefaultOverridden; }
281 bool IsStaticOverridden() const { return bStaticOverridden; }
282 FSkinWeightProfileStack GetDefaultProfileStack() const { return DefaultProfileStack; }
283
284private:
287
288 bool HasProfileStack(const FSkinWeightProfileStack& InProfileStack) const;
289 void InitialiseProfileBuffer(const FSkinWeightProfileStack& InProfileStack);
290 void ReleaseBuffer(const FSkinWeightProfileStack& InProfileStack, bool bForceRelease = false);
291
292 void ApplyOverrideProfileStack(const FSkinWeightProfileStack& InProfileStack, FSkinWeightVertexBuffer* OverrideBuffer, const uint8* BaseBufferData = nullptr);
293 bool IsPendingReadback() const;
294 void EnqueueGPUReadback();
295 bool IsGPUReadbackFinished() const;
296 void EnqueueDataReadback();
297 bool IsDataReadbackPending() const;
298 bool IsDataReadbackFinished() const;
299 void ResetGPUReadback();
300
301 FSkinWeightVertexBuffer* BaseBuffer = nullptr;
302 FSkinWeightVertexBuffer* DefaultOverrideSkinWeightBuffer = nullptr;
303
305
307
308 bool bDefaultOverridden = false;
309 bool bStaticOverridden = false;
310 FSkinWeightProfileStack DefaultProfileStack;
311
312 FSkinWeightReadbackData ReadbackData;
313};
314
uint16 FBoneIndexType
Definition BoneIndices.h:7
@ InPlace
Definition CoreMiscDefines.h:162
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
#define MAX_TOTAL_INFLUENCES
Definition GPUSkinPublicDefs.h:12
void Init()
Definition LockFreeList.h:4
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define UE_REQUIRES(...)
Definition Requires.h:86
ENGINE_API FAutoConsoleVariableRef CVarSkinWeightsLoadByDefaultMode
ENGINE_API int32 GSkinWeightProfilesAllowedFromLOD
Definition SkinWeightProfile.cpp:130
ENGINE_API FAutoConsoleVariableRef CVarSkinWeightProfilesAllowedFromLOD
ENGINE_API int32 GSkinWeightProfilesDefaultLODOverride
Definition SkinWeightProfile.cpp:121
ENGINE_API int32 GSkinWeightProfilesLoadByDefaultMode
Definition SkinWeightProfile.cpp:107
ENGINE_API FAutoConsoleVariableRef CVarSkinWeightProfilesDefaultLODOverride
constexpr uint32 HashCombineFast(uint32 A, uint32 B)
Definition TypeHash.h:74
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 Archive.h:1208
Definition IConsoleManager.h:1580
Definition NameTypes.h:617
Definition RHICommandList.h:455
Definition RHIResourceReplace.h:55
Definition SkinWeightProfileManager.h:54
Definition SkinWeightProfileManager.h:98
Definition SkinWeightVertexBuffer.h:364
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition StaticArray.h:26
Definition StringBuilder.h:509
Definition UniquePtr.h:107
Definition SkeletalMesh.h:440
const FName SkinWeights("SkinWeights")
Definition SkeletalMeshAttributes.h:25
Definition SkinWeightProfile.h:21
auto JoinBy(RangeType &&Range, ProjectionType Projection, DelimiterType &&Delimiter) -> Private::TJoinBy< RangeType, ProjectionType, DelimiterType >
Definition Join.h:159
U16 Index
Definition radfft.cpp:71
Definition PerPlatformProperties.h:384
Definition PerPlatformProperties.h:211
uint32 InfluencesOffset
Definition SkinWeightProfile.h:90
friend FArchive & operator<<(FArchive &Ar, FSkinWeightOverrideInfo &OverrideInfo)
Definition SkinWeightProfile.cpp:168
Definition SkinWeightProfile.h:85
uint8 NumWeightsPerVertex
Definition SkinWeightProfile.h:114
bool b16BitBoneIndices
Definition SkinWeightProfile.h:115
TMap< uint32, uint32 > VertexIndexToInfluenceOffset
Definition SkinWeightProfile.h:112
void ApplyDefaultOverride(FSkinWeightVertexBuffer *Buffer) const
Definition SkinWeightProfile.cpp:882
TArray< uint8 > BoneIDs
Definition SkinWeightProfile.h:109
friend FArchive & operator<<(FArchive &Ar, FRuntimeSkinWeightProfileData &OverrideData)
Definition SkinWeightProfile.cpp:139
void ApplyOverrides(FSkinWeightVertexBuffer *OverrideBuffer) const
Definition SkinWeightProfile.cpp:847
TArray< uint8 > BoneWeights
Definition SkinWeightProfile.h:110
Definition SkinWeightProfile.h:36
Definition SkinWeightProfile.h:133
bool operator==(const FSkinWeightProfileStack &InProfileStack) const
Definition SkinWeightProfile.h:164
FName operator[](int32 InLayerIndex) const
Definition SkinWeightProfile.h:173
FString GetUniqueId() const
Definition SkinWeightProfile.h:218
void CopyIntoArray(FName OutProfileNames[MaxLayerCount]) const
Definition SkinWeightProfile.h:195
FName & operator[](int32 InLayerIndex)
Definition SkinWeightProfile.h:178
static constexpr int32 MaxLayerCount
Definition SkinWeightProfile.h:134
TStaticArray< FName, MaxLayerCount > Layers
Definition SkinWeightProfile.h:135
FSkinWeightProfileStack Normalized() const
Definition SkinWeightProfile.h:204
bool IsEmpty() const
Definition SkinWeightProfile.h:183
FSkinWeightProfileStack(const FName InProfileNames[MaxLayerCount])
Definition SkinWeightProfile.h:156
FSkinWeightProfileStack()
Definition SkinWeightProfile.h:137
bool operator!=(const FSkinWeightProfileStack &InProfileStack) const
Definition SkinWeightProfile.h:168
FSkinWeightProfileStack(ArgTypes &&... Args)
Definition SkinWeightProfile.h:146
friend uint32 GetTypeHash(const FSkinWeightProfileStack &InProfileStack)
Definition SkinWeightProfile.h:224
Definition SkinWeightProfile.h:238
ENGINE_API void ReleaseCPUResources()
Definition SkinWeightProfile.cpp:592
ENGINE_API void InitRHIForStreaming(const TArray< TPair< FSkinWeightProfileStack, FSkinWeightRHIInfo > > &IntermediateBuffers, FRHIResourceReplaceBatcher &Batcher)
Definition SkinWeightProfile.cpp:826
ENGINE_API bool ContainsProfile(const FName &ProfileName) const
Definition SkinWeightProfile.cpp:443
ENGINE_API void OverrideBaseBufferSkinWeightData(USkeletalMesh *Mesh, int32 LODIndex)
Definition SkinWeightProfile.cpp:254
ENGINE_API ~FSkinWeightProfilesData()
Definition SkinWeightProfile.cpp:246
ENGINE_API void CreateRHIBuffers(FRHICommandListBase &RHICmdList, TArray< TPair< FSkinWeightProfileStack, FSkinWeightRHIInfo > > &OutBuffers)
Definition SkinWeightProfile.cpp:602
bool IsStaticOverridden() const
Definition SkinWeightProfile.h:281
ENGINE_API const FRuntimeSkinWeightProfileData * GetOverrideData(const FName &ProfileName) const
Definition SkinWeightProfile.cpp:485
ENGINE_API SIZE_T GetCPUAccessMemoryOverhead() const
Definition SkinWeightProfile.cpp:563
ENGINE_API void ClearDynamicDefaultSkinWeightProfile(USkeletalMesh *Mesh, int32 LODIndex)
Definition SkinWeightProfile.cpp:411
ENGINE_API void SetDynamicDefaultSkinWeightProfile(USkeletalMesh *Mesh, int32 LODIndex, bool bSerialization=false)
Definition SkinWeightProfile.cpp:295
ENGINE_API FRuntimeSkinWeightProfileData & AddOverrideData(const FName &ProfileName)
Definition SkinWeightProfile.cpp:490
DECLARE_DELEGATE_RetVal_ThreeParams(int32, FOnPickOverrideSkinWeightProfile, const USkeletalMesh *, const TArrayView< const FSkinWeightProfileInfo >, int32)
bool ContainsOverrideBuffer(const FSkinWeightProfileStack &InProfileStack) const
Definition SkinWeightProfile.cpp:479
FSkinWeightVertexBuffer * GetDefaultOverrideBuffer() const
Definition SkinWeightProfile.h:253
ENGINE_API void SetupDynamicDefaultSkinWeightProfile()
Definition SkinWeightProfile.cpp:435
ENGINE_API void SerializeMetaData(FArchive &Ar)
Definition SkinWeightProfile.cpp:573
ENGINE_API void ReleaseRHIForStreaming(FRHIResourceReplaceBatcher &Batcher)
Definition SkinWeightProfile.cpp:839
ENGINE_API SIZE_T GetResourcesSize() const
Definition SkinWeightProfile.cpp:552
FSkinWeightProfileStack GetDefaultProfileStack() const
Definition SkinWeightProfile.h:282
friend FArchive & operator<<(FArchive &Ar, FSkinWeightProfilesData &OverrideData)
Definition SkinWeightProfile.cpp:161
static ENGINE_API FOnPickOverrideSkinWeightProfile OnPickOverrideSkinWeightProfile
Definition SkinWeightProfile.h:244
ENGINE_API void ReleaseResources()
Definition SkinWeightProfile.cpp:519
ENGINE_API FSkinWeightVertexBuffer * GetOverrideBuffer(const FSkinWeightProfileStack &InProfileStack) const
Definition SkinWeightProfile.cpp:448
bool IsDefaultOverridden() const
Definition SkinWeightProfile.h:280
Definition SkinWeightProfile.h:121
FCriticalSection Mutex
Definition SkinWeightProfile.h:122
uint32 ReadbackFinishedFrameIndex
Definition SkinWeightProfile.h:126
TArray< uint8 > ReadbackData
Definition SkinWeightProfile.h:125
TUniquePtr< FRHIGPUBufferReadback > BufferReadback
Definition SkinWeightProfile.h:124
Definition Tuple.h:652