UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AttributeBlendData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6
7
8namespace UE
9{
10 namespace Anim
11 {
13 {
14 friend struct Attributes;
15
16 protected:
18 {
19 return FAttributeBlendData(SourceAttributes, SourceWeights, AttributeScriptStruct);
20 }
21
26
31
37
39 {
40 ensure(SourceAttributes.Num() == 1);
41 return FAttributeBlendData(SourceAttributes, InUniformWeight, AdditiveType, AttributeScriptStruct);
42 }
43
48
53
58
63
68 private:
69 // Blend constructor
71
72 // Blend-by-ptr constructor
74
75 // Blend remapped weights constructor
77
78 // Accumulate using a single weight
80
81 // Additive accumulate using a single weight
83
84 // Blend using per-bone blend weights
86
87 // Blend using BlendSample (per-bone) weight data
89
90 // Blend using BlendSample (per-bone) remapped weight data
92
93 // Blend (per-bone filtered) using (per-bone) weight data
95
96 // Blend using (per-bone) weight data for one of the two inputs
98
100 private:
102
104 ENGINE_API float GetContainerWeight(int32 ContainerIndex) const;
105
106 /* Retrieves the weight on a per-bone level basis according to the attribute and bone indices */
107 ENGINE_API float GetBoneWeight(int32 AttributeIndex, int32 BoneIndex) const;
108
110 ENGINE_API bool HasBoneWeights() const;
111 ENGINE_API bool HasContainerWeights() const;
112 private:
114 struct FAttributeSet
115 {
118
121
124
126 float HighestWeight;
127 int32 HighestWeightedIndex;
128 };
129
131 struct FUniqueAttribute
132 {
134 const FAttributeId* Identifier;
135
137 int32 WeightIndex;
138
140 const uint8* DataPtr;
141 };
142
146
148 float UniformWeight;
149 /* Contains container of per-bone weights */
151 /* Contains container or BlendSampleDataCache remapping indices */
152 TArrayView<const int32> WeightIndices;
154 EAdditiveAnimationType AdditiveType;
155
158 TArray<int32, FAnimStackAllocator> HighestBoneWeightedIndices;
159 inline const TArrayView<const float>& GetBoneWeights() const { return Weights; }
160 bool bPerBoneFilter = false;
161
163 TArrayView<const int32> PerBoneInterpolationIndices;
164 TArrayView<const FBlendSampleData> BlendSampleDataCache;
165 inline const TArrayView<const int32>& GetBlendSampleDataCacheIndices() const { return WeightIndices; }
166 public:
167 template<typename AttributeType>
169 {
170 friend struct FAttributeBlendData;
171 protected:
173 public:
175 const AttributeType& GetValue() const
176 {
177 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.DataPtrs.IsValidIndex(CurrentIndex));
178 return *(const AttributeType*)Collection.DataPtrs[CurrentIndex];
179 }
180
182 const float GetWeight() const
183 {
184 check(Data.HasContainerWeights());
185 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.WeightIndices.IsValidIndex(CurrentIndex));
186 return Data.GetContainerWeight(Collection.WeightIndices[CurrentIndex]);
187 }
188
190 const float GetBoneWeight() const
191 {
192 check(Data.HasBoneWeights());
193 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.WeightIndices.IsValidIndex(CurrentIndex));
194 return Data.GetBoneWeight(Collection.WeightIndices[CurrentIndex], Collection.Identifier->GetIndex());
195 }
196
198 const AttributeType& GetHighestWeightedValue() const
199 {
200 check(Data.HasContainerWeights());
201 check(Collection.HighestWeightedIndex < Collection.DataPtrs.Num() && Collection.DataPtrs.IsValidIndex(Collection.HighestWeightedIndex));
202 return *(const AttributeType*)Collection.DataPtrs[Collection.HighestWeightedIndex];
203 }
204
206 const AttributeType& GetHighestBoneWeightedValue() const
207 {
208 check(Data.HasBoneWeights());
209
211 float Weight = -1.f;
212 for (const int32 Index : Collection.WeightIndices)
213 {
214 const float BoneWeight = Data.GetBoneWeight(Index, Collection.Identifier->GetIndex());
215 if (BoneWeight > Weight)
216 {
217 Weight = BoneWeight;
219 }
220 }
222 return *(const AttributeType*)Collection.DataPtrs[Collection.WeightIndices.IndexOfByKey(HighestIndex)];
223 }
224
226 void GetHighestBoneWeighted(const AttributeType*& OutAttributePtr, float& OutWeight) const
227 {
228 check(Data.HasBoneWeights());
229
231 float Weight = -1.f;
232 for (const int32 Index : Collection.WeightIndices)
233 {
234 const float BoneWeight = Data.GetBoneWeight(Index, Collection.Identifier->GetIndex());
235 if (BoneWeight > Weight)
236 {
237 Weight = BoneWeight;
239 }
240 }
242 OutAttributePtr = (const AttributeType*)Collection.DataPtrs[Collection.WeightIndices.IndexOfByKey(HighestIndex)];
243 OutWeight = Weight;
244 }
245
248 {
249 return *Collection.Identifier;
250 }
251
253 {
254 return Data.AdditiveType;
255 }
256
257 bool IsFilteredBlend() const
258 {
259 return Data.bPerBoneFilter;
260 }
261
263 bool Next()
264 {
265 ++CurrentIndex;
266 return CurrentIndex < Collection.DataPtrs.Num();
267 }
268
270 {
271 return CurrentIndex;
272 }
273 protected:
277 const FAttributeSet& Collection;
279 };
280
282 {
283 friend struct FAttributeBlendData;
284 protected:
286 public:
288 const uint8* GetValuePtr() const
289 {
290 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.DataPtrs.IsValidIndex(CurrentIndex));
291 return Collection.DataPtrs[CurrentIndex];
292 }
293
295 const float GetWeight() const
296 {
297 check(Data.HasContainerWeights());
298 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.WeightIndices.IsValidIndex(CurrentIndex));
299 return Data.GetContainerWeight(Collection.WeightIndices[CurrentIndex]);
300 }
301
303 const float GetBoneWeight() const
304 {
305 check(Data.HasBoneWeights());
306 check(CurrentIndex < Collection.DataPtrs.Num() && Collection.WeightIndices.IsValidIndex(CurrentIndex));
307 return Data.GetBoneWeight(Collection.WeightIndices[CurrentIndex], Collection.Identifier->GetIndex());
308 }
309
312 {
313 check(Data.HasContainerWeights());
314 check(Collection.HighestWeightedIndex < Collection.DataPtrs.Num() && Collection.DataPtrs.IsValidIndex(Collection.HighestWeightedIndex));
315 return Collection.DataPtrs[Collection.HighestWeightedIndex];
316 }
317
320 {
321 check(Data.HasBoneWeights());
322
324 float Weight = -1.f;
325 for (const int32 Index : Collection.WeightIndices)
326 {
327 const float BoneWeight = Data.GetBoneWeight(Index, Collection.Identifier->GetIndex());
328 if (BoneWeight > Weight)
329 {
330 Weight = BoneWeight;
332 }
333 }
335 return Collection.DataPtrs[Collection.WeightIndices.IndexOfByKey(HighestIndex)];
336 }
337
339 void GetHighestBoneWeighted(const uint8* OutAttributePtr, float& OutWeight) const
340 {
341 check(Data.HasBoneWeights());
342
344 float Weight = -1.f;
345 for (const int32 Index : Collection.WeightIndices)
346 {
347 const float BoneWeight = Data.GetBoneWeight(Index, Collection.Identifier->GetIndex());
348 if (BoneWeight > Weight)
349 {
350 Weight = BoneWeight;
352 }
353 }
355 OutAttributePtr = Collection.DataPtrs[Collection.WeightIndices.IndexOfByKey(HighestIndex)];
356 OutWeight = Weight;
357 }
358
361 {
362 return *Collection.Identifier;
363 }
364
366 {
367 return Data.AdditiveType;
368 }
369
370 bool IsFilteredBlend() const
371 {
372 return Data.bPerBoneFilter;
373 }
374
376 bool Next()
377 {
378 ++CurrentIndex;
379 return CurrentIndex < Collection.DataPtrs.Num();
380 }
381
383 {
384 return CurrentIndex;
385 }
386 protected:
390 const FAttributeSet& Collection;
392 };
393
394 template<typename AttributeType>
396 {
397 friend struct FAttributeBlendData;
398 protected:
400 public:
402 bool Next()
403 {
404 ++CurrentIndex;
406 }
407
409 const AttributeType& GetValue() const
410 {
412 return *(const AttributeType*)AttributesView[CurrentIndex].DataPtr;
413 }
414
416 const float GetWeight() const
417 {
418 check(Data.HasContainerWeights());
420
421 return Data.GetContainerWeight(AttributesView[CurrentIndex].WeightIndex);
422 }
423
425 const float GetBoneWeight() const
426 {
427 check(Data.HasBoneWeights());
429
430 return Data.GetBoneWeight(AttributesView[CurrentIndex].WeightIndex, AttributesView[CurrentIndex].Identifier->GetIndex());
431 }
432
435 {
436 check(Data.HasBoneWeights());
438 check(Data.HighestBoneWeightedIndices.IsValidIndex(AttributesView[CurrentIndex].Identifier->GetIndex()));
439
440 return Data.HighestBoneWeightedIndices[AttributesView[CurrentIndex].Identifier->GetIndex()] == AttributesView[CurrentIndex].WeightIndex;
441 }
442
449
451 {
452 return Data.AdditiveType;
453 }
454
455 bool IsFilteredBlend() const
456 {
457 return Data.bPerBoneFilter;
458 }
459
460 protected:
465 };
466
468 {
469 friend struct FAttributeBlendData;
470 protected:
472 public:
474 bool Next()
475 {
476 ++CurrentIndex;
478 }
479
486
488 const float GetWeight() const
489 {
490 check(Data.HasContainerWeights());
492
493 return Data.GetContainerWeight(AttributesView[CurrentIndex].WeightIndex);
494 }
495
497 const float GetBoneWeight() const
498 {
499 check(Data.HasBoneWeights());
501
502 return Data.GetBoneWeight(AttributesView[CurrentIndex].WeightIndex, AttributesView[CurrentIndex].Identifier->GetIndex());
503 }
504
507 {
508 check(Data.HasBoneWeights());
510 check(Data.HighestBoneWeightedIndices.IsValidIndex(AttributesView[CurrentIndex].Identifier->GetIndex()));
511
512 return Data.HighestBoneWeightedIndices[AttributesView[CurrentIndex].Identifier->GetIndex()] == AttributesView[CurrentIndex].WeightIndex;
513 }
514
521
523 {
524 return Data.AdditiveType;
525 }
526
527 bool IsFilteredBlend() const
528 {
529 return Data.bPerBoneFilter;
530 }
531
532 protected:
537 };
538
539 public:
540 template<typename AttributeType>
542 {
543 for (const FAttributeSet& Collection : AttributeSets)
544 {
546 ForEachFunction(It);
547 }
548 }
549
550 template<typename AttributeType>
556
558 {
559 for (const FAttributeSet& Collection : AttributeSets)
560 {
562 ForEachFunction(It);
563 }
564 }
565
567 {
568 TSingleRawIterator It(*this, UniqueAttributes);
569 ForEachFunction(It);
570 }
571 };
572 }
573}
EAdditiveAnimationType
Definition AnimTypes.h:575
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ 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
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
UE_FORCEINLINE_HINT constexpr bool IsValidIndex(SizeType Index) const
Definition ArrayView.h:359
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition Class.h:1720
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition AttributesRuntime.h:57
Definition AttributeBlendData.h:169
bool Next()
Definition AttributeBlendData.h:263
const AttributeType & GetHighestBoneWeightedValue() const
Definition AttributeBlendData.h:206
const FAttributeBlendData & Data
Definition AttributeBlendData.h:275
const AttributeType & GetHighestWeightedValue() const
Definition AttributeBlendData.h:198
TAttributeSetIterator(const FAttributeBlendData &InData, const FAttributeSet &InCollection)
Definition AttributeBlendData.h:172
void GetHighestBoneWeighted(const AttributeType *&OutAttributePtr, float &OutWeight) const
Definition AttributeBlendData.h:226
bool IsFilteredBlend() const
Definition AttributeBlendData.h:257
const float GetWeight() const
Definition AttributeBlendData.h:182
int32 GetIndex() const
Definition AttributeBlendData.h:269
EAdditiveAnimationType GetAdditiveType() const
Definition AttributeBlendData.h:252
const float GetBoneWeight() const
Definition AttributeBlendData.h:190
const FAttributeId & GetIdentifier() const
Definition AttributeBlendData.h:247
int32 CurrentIndex
Definition AttributeBlendData.h:278
const AttributeType & GetValue() const
Definition AttributeBlendData.h:175
const FAttributeSet & Collection
Definition AttributeBlendData.h:277
const FAttributeBlendData & Data
Definition AttributeBlendData.h:388
EAdditiveAnimationType GetAdditiveType() const
Definition AttributeBlendData.h:365
const uint8 * GetHighestWeightedValue() const
Definition AttributeBlendData.h:311
const uint8 * GetValuePtr() const
Definition AttributeBlendData.h:288
bool Next()
Definition AttributeBlendData.h:376
const FAttributeId & GetIdentifier() const
Definition AttributeBlendData.h:360
const FAttributeSet & Collection
Definition AttributeBlendData.h:390
int32 GetIndex() const
Definition AttributeBlendData.h:382
TAttributeSetRawIterator(const FAttributeBlendData &InData, const FAttributeSet &InCollection)
Definition AttributeBlendData.h:285
const uint8 * GetHighestBoneWeightedValue() const
Definition AttributeBlendData.h:319
const float GetBoneWeight() const
Definition AttributeBlendData.h:303
int32 CurrentIndex
Definition AttributeBlendData.h:391
const float GetWeight() const
Definition AttributeBlendData.h:295
bool IsFilteredBlend() const
Definition AttributeBlendData.h:370
void GetHighestBoneWeighted(const uint8 *OutAttributePtr, float &OutWeight) const
Definition AttributeBlendData.h:339
Definition AttributeBlendData.h:396
const FAttributeId & GetIdentifier() const
Definition AttributeBlendData.h:444
int32 CurrentIndex
Definition AttributeBlendData.h:464
TSingleIterator(const FAttributeBlendData &InData, TArrayView< const FUniqueAttribute > InAttributes)
Definition AttributeBlendData.h:399
TArrayView< const FUniqueAttribute > AttributesView
Definition AttributeBlendData.h:463
bool IsFilteredBlend() const
Definition AttributeBlendData.h:455
const FAttributeBlendData & Data
Definition AttributeBlendData.h:462
bool Next()
Definition AttributeBlendData.h:402
const float GetBoneWeight() const
Definition AttributeBlendData.h:425
bool IsHighestBoneWeighted() const
Definition AttributeBlendData.h:434
const float GetWeight() const
Definition AttributeBlendData.h:416
const AttributeType & GetValue() const
Definition AttributeBlendData.h:409
EAdditiveAnimationType GetAdditiveType() const
Definition AttributeBlendData.h:450
Definition AttributeBlendData.h:468
bool IsHighestBoneWeighted() const
Definition AttributeBlendData.h:506
const float GetBoneWeight() const
Definition AttributeBlendData.h:497
const uint8 * GetValuePtr() const
Definition AttributeBlendData.h:481
bool Next()
Definition AttributeBlendData.h:474
const float GetWeight() const
Definition AttributeBlendData.h:488
TArrayView< const FUniqueAttribute > AttributesView
Definition AttributeBlendData.h:535
const FAttributeId & GetIdentifier() const
Definition AttributeBlendData.h:516
bool IsFilteredBlend() const
Definition AttributeBlendData.h:527
const FAttributeBlendData & Data
Definition AttributeBlendData.h:534
EAdditiveAnimationType GetAdditiveType() const
Definition AttributeBlendData.h:522
int32 CurrentIndex
Definition AttributeBlendData.h:536
TSingleRawIterator(const FAttributeBlendData &InData, TArrayView< const FUniqueAttribute > InAttributes)
Definition AttributeBlendData.h:471
Definition AttributeBlendData.h:13
static FAttributeBlendData PerBoneRemappedBlendSamples(const TArrayView< const FStackAttributeContainer > SourceAttributes, TArrayView< const int32 > InPerBoneInterpolationIndices, const TArrayView< const FBlendSampleData > InBlendSampleDataCache, TArrayView< const int32 > InBlendSampleDataCacheIndices, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:54
static FAttributeBlendData PerContainerPtrWeighted(const TArrayView< const FStackAttributeContainer *const > SourceAttributes, const TArrayView< const float > SourceWeights, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:22
static FAttributeBlendData SingleAdditiveContainerUniformWeighted(const TArrayView< const FStackAttributeContainer *const > SourceAttributes, const float InUniformWeight, EAdditiveAnimationType AdditiveType, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:38
static FAttributeBlendData PerBoneBlendSamples(const TArrayView< const FStackAttributeContainer > SourceAttributes, TArrayView< const int32 > InPerBoneInterpolationIndices, const TArrayView< const FBlendSampleData > InBlendSampleDataCache, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:49
void ForEachAttributeSet(TFunctionRef< void(TAttributeSetIterator< AttributeType > &)> ForEachFunction) const
Definition AttributeBlendData.h:541
static FAttributeBlendData PerBoneSingleContainerWeighted(const FStackAttributeContainer &SourceAttributes1, const FStackAttributeContainer &SourceAttributes2, const TArrayView< const float > WeightsOfSource2, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:64
void ForEachUniqueAttribute(TFunctionRef< void(TSingleRawIterator &)> ForEachFunction) const
Definition AttributeBlendData.h:566
static FAttributeBlendData PerBoneWeighted(const TArrayView< const FStackAttributeContainer > SourceAttributes, const TArrayView< const FPerBoneBlendWeight > InPerBoneBlendWeights, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:44
static FAttributeBlendData PerContainerWeighted(const TArrayView< const FStackAttributeContainer > SourceAttributes, const TArrayView< const float > SourceWeights, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:17
static FAttributeBlendData PerContainerRemappedWeighted(const TArrayView< const FStackAttributeContainer > SourceAttributes, const TArrayView< const float > SourceWeights, const TArrayView< const int32 > SourceWeightsIndices, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:27
void ForEachUniqueAttribute(TFunctionRef< void(TSingleIterator< AttributeType > &)> ForEachFunction) const
Definition AttributeBlendData.h:551
static FAttributeBlendData PerBoneFilteredWeighted(const FStackAttributeContainer &BaseAttributes, const TArrayView< const FStackAttributeContainer > SourceAttributes, const TArrayView< const FPerBoneBlendWeight > InPerBoneBlendWeights, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:59
void ForEachAttributeSet(TFunctionRef< void(TAttributeSetRawIterator &)> ForEachFunction) const
Definition AttributeBlendData.h:557
static FAttributeBlendData SingleContainerUniformWeighted(const TArrayView< const FStackAttributeContainer *const > SourceAttributes, const float InUniformWeight, const UScriptStruct *AttributeScriptStruct)
Definition AttributeBlendData.h:32
Definition AttributesContainer.h:27
Definition AttributesRuntime.h:40