UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AttributeBlendOperator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
10
11#include "HAL/Platform.h"
12
13namespace UE
14{
15 namespace Anim
16 {
19 template<typename AttributeType>
21 {
22 public:
24 virtual void Accumulate(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final { Accumulate_Internal<AttributeType>(BlendData, OutAttributes); }
25 virtual void Interpolate(const void* FromData, const void* ToData, float Alpha, void* InOutData) const final { Interpolate_Internal<AttributeType>(FromData, ToData, Alpha, InOutData); }
26 virtual void Override(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final { Override_Internal<AttributeType>(BlendData, OutAttributes); }
27 virtual void Blend(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final { Blend_Internal<AttributeType>(BlendData, OutAttributes); }
28 virtual void BlendPerBone(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final { BlendPerBone_Internal<AttributeType>(BlendData, OutAttributes); }
32 protected:
34 template <typename Type>
36 {
37 BlendData.ForEachAttributeSet<AttributeType>([OutAttributes](typename FAttributeBlendData::template TAttributeSetIterator<AttributeType>& It) -> void
38 {
39 const FAttributeId& Identifier = It.GetIdentifier();
41
42 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
43 AttributeType& OutAttribute = (*OutAttributePtr);
44
46 {
47 // Not iterating over each attribute, but just picking highest weighted value
48 OutAttribute = It.GetHighestWeightedValue();
49 }
50 else
51 {
52 // Iterate over each attribute while accumulating final value according to provided weightings
53 while (It.Next())
54 {
55 const AttributeType& Attribute = It.GetValue();
56 const float AttributeWeight = It.GetWeight();
57
58 if (It.GetIndex() == 0)
59 {
62 }
63 else
64 {
65 OutAttribute.Accumulate(Attribute, AttributeWeight, It.GetAdditiveType());
66 }
67 }
68
70 {
71 OutAttribute.Normalize();
72 }
73 }
74 });
75
76 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
77 {
78 while (It.Next())
79 {
80 const AttributeType& Attribute = It.GetValue();
81 const float AttributeWeight = It.GetWeight();
82 const FAttributeId& Identifier = It.GetIdentifier();
84
85 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
86 AttributeType& OutAttribute = (*OutAttributePtr);
87
88 // Choose between weighted (blended) assignment vs override
90 {
92 }
93 else
94 {
96 }
97
99 {
100 OutAttribute.Normalize();
101 }
102 }
103 });
104 }
105
107 template <typename Type>
109 {
110 BlendData.ForEachAttributeSet<AttributeType>([OutAttributes](typename FAttributeBlendData::template TAttributeSetIterator<AttributeType>& It) -> void
111 {
112 const FAttributeId& Identifier = It.GetIdentifier();
114
115 // Not iterating over each attribute, but just picking highest weighted value
116 OutAttributes->Add<AttributeType>(Identifier, It.GetHighestWeightedValue());
117 });
118
119 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
120 {
121 while (It.Next())
122 {
123 const FAttributeId& Identifier = It.GetIdentifier();
124 OutAttributes->Add<AttributeType>(Identifier, It.GetValue());
125 }
126 });
127 }
128
129 /* Per-bone weighted blend operation for blendable attribute types */
130 template <typename Type>
132 {
133 BlendData.ForEachAttributeSet<AttributeType>([this, OutAttributes](typename FAttributeBlendData::template TAttributeSetIterator<AttributeType>& It) -> void
134 {
135 const FAttributeId& Identifier = It.GetIdentifier();
137
138 const int32 ExistingIndex = OutAttributes->IndexOfByKey<AttributeType>(Identifier);
139 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
140 AttributeType& OutAttribute = *OutAttributePtr;
141
143 {
144 // Not iterating over each attribute, but just picking highest weighted value
145 OutAttribute = It.GetHighestBoneWeightedValue();
146 }
147 else
148 {
149 while (It.Next())
150 {
151 const float AttributeWeight = It.GetBoneWeight();
152 const AttributeType& Attribute = It.GetValue();
154 {
156 break;
157 }
158 else
159 {
160 if (It.GetIndex() == 0 && ExistingIndex == INDEX_NONE)
161 {
163 }
164 else
165 {
166 OutAttribute.Accumulate(Attribute, AttributeWeight, It.GetAdditiveType());
167 }
168 }
169 }
170
172 {
173 OutAttribute.Normalize();
174 }
175 }
176 });
177
178 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
179 {
180 while (It.Next())
181 {
182 const FAttributeId& Identifier = It.GetIdentifier();
183 const int32 ExistingIndex = OutAttributes->IndexOfByKey<AttributeType>(Identifier);
184
185 const float AttributeWeight = It.GetBoneWeight();
186 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
187 AttributeType& OutAttribute = *OutAttributePtr;
188
191 {
192 OutAttribute = It.GetValue();
193 }
194 else
195 {
196 const AttributeType& Attribute = It.GetValue();
198 {
200 }
201 else
202 {
203 OutAttribute.Accumulate(Attribute, AttributeWeight, It.GetAdditiveType());
204 }
205 }
206
208 {
209 OutAttribute.Normalize();
210 }
211 }
212 });
213 }
214
215 /* Per-bone weighted blend operation for non-blendable attribute types */
216 template <typename Type>
218 {
219 BlendData.ForEachAttributeSet<AttributeType>([OutAttributes](typename FAttributeBlendData::template TAttributeSetIterator<AttributeType>& It) -> void
220 {
221 const FAttributeId& Identifier = It.GetIdentifier();
222 AttributeType* OutAttribute = OutAttributes->FindOrAdd<AttributeType>(Identifier);
223 AttributeType::StaticStruct()->CopyScriptStruct(OutAttribute, &It.GetHighestBoneWeightedValue());
224 });
225
226 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
227 {
228 while (It.Next())
229 {
230 const FAttributeId& Identifier = It.GetIdentifier();
231 const int32 ExistingIndex = OutAttributes->IndexOfByKey<AttributeType>(Identifier);
232 const float BoneWeight = It.GetBoneWeight();
233
235 {
236 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
237 AttributeType& OutAttribute = *OutAttributePtr;
238 const AttributeType& Attribute = It.GetValue();
239
240 // 'Blend' value if the attribute did not yet exist, or based upon being the highest weighted attribute
241 const bool bHighestWeight = It.IsHighestBoneWeighted();
243 {
244 AttributeType::StaticStruct()->CopyScriptStruct(OutAttributePtr, &Attribute);
245 }
246 }
247 }
248 });
249 }
250
251 /* Override operation for blendable attribute types */
252 template <typename Type>
254 {
255 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
256 {
257 while (It.Next())
258 {
259 const AttributeType& Attribute = It.GetValue();
260 const FAttributeId& Identifier = It.GetIdentifier();
261
262 // Find or add as the attribute might already exist, so Add would fail
263 AttributeType& OutAttribute = *OutAttributes->FindOrAdd<AttributeType>(Identifier);
264
265 const float AttributeWeight = It.GetWeight();
267
269 {
270 OutAttribute.Normalize();
271 }
272 }
273 });
274 }
275
276 /* Override operation for non-blendable attribute types */
277 template <typename Type>
279 {
280 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
281 {
282 while (It.Next())
283 {
284 const AttributeType& Attribute = It.GetValue();
285 const FAttributeId& Identifier = It.GetIdentifier();
286
287 // Find or add as the attribute might already exist, so Add would fail
288 AttributeType& OutAttribute = *OutAttributes->FindOrAdd<AttributeType>(Identifier);
289 AttributeType::StaticStruct()->CopyScriptStruct(&OutAttribute, &Attribute);
290 }
291 });
292 }
293
294 /* Accumulate operation for blendable attribute types */
295 template <typename Type>
297 {
298 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
299 {
300 while (It.Next())
301 {
302 const AttributeType& Attribute = It.GetValue();
303 const FAttributeId& Identifier = It.GetIdentifier();
304 const int32 ExistingIndex = OutAttributes->IndexOfByKey<AttributeType>(Identifier);
305 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
306 AttributeType& OutAttribute = *OutAttributePtr;
307
308 // Accumulate with weighted add
309 const float AttributeWeight = It.GetWeight();
311 {
312 OutAttribute.Accumulate(Attribute, AttributeWeight, It.GetAdditiveType());
313 }
314 else
315 {
317 }
318
320 {
321 OutAttribute.Normalize();
322 }
323 }
324 });
325 }
326
327 /* Accumulate operation for non-blendable attribute types */
328 template <typename Type>
330 {
331 BlendData.ForEachUniqueAttribute<AttributeType>([OutAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
332 {
333 while (It.Next())
334 {
335 const AttributeType& Attribute = It.GetValue();
336 const FAttributeId& Identifier = It.GetIdentifier();
337 const int32 ExistingIndex = OutAttributes->IndexOfByKey<AttributeType>(Identifier);
338 AttributeType* OutAttributePtr = OutAttributes->FindOrAdd<AttributeType>(Identifier);
339 AttributeType& OutAttribute = *OutAttributePtr;
340
341 // 'Accumulate' value if the attribute did not yet exist, or based upon being the highest weighted attribute
342 const float AttributeWeight = It.GetWeight();
344 {
345 AttributeType::StaticStruct()->CopyScriptStruct(OutAttributePtr, &Attribute);
346 }
347 }
348 });
349 }
350
351 /* Make additive operation for blendable attribute types */
352 template <typename Type>
354 {
355 BlendData.ForEachUniqueAttribute<AttributeType>([OutAdditiveAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
356 {
357 while (It.Next())
358 {
359 const AttributeType& Attribute = It.GetValue();
360 const FAttributeId& Identifier = It.GetIdentifier();
361 const int32 ExistingIndex = OutAdditiveAttributes->IndexOfByKey<AttributeType>(Identifier);
362 AttributeType* OutAttributePtr = OutAdditiveAttributes->FindOrAdd<AttributeType>(Identifier);
363 AttributeType& OutAttribute = *OutAttributePtr;
364
365 OutAttribute.MakeAdditive(Attribute);
366
368 {
369 OutAttribute.Normalize();
370 }
371 }
372 });
373 }
374
375 /* Make additive operation for non-blendable attribute types */
376 template <typename Type>
378 {
379 BlendData.ForEachUniqueAttribute<AttributeType>([OutAdditiveAttributes](typename FAttributeBlendData::template TSingleIterator<AttributeType>& It) -> void
380 {
381 while (It.Next())
382 {
383 const AttributeType& Attribute = It.GetValue();
384 const FAttributeId& Identifier = It.GetIdentifier();
385 const int32 ExistingIndex = OutAdditiveAttributes->IndexOfByKey<AttributeType>(Identifier);
386 AttributeType* OutAttributePtr = OutAdditiveAttributes->FindOrAdd<AttributeType>(Identifier);
387 AttributeType& OutAttribute = *OutAttributePtr;
388
389 // 'Accumulate' value if the attribute did not yet exist, or based upon being the highest weighted attribute
390 const float AttributeWeight = It.GetWeight();
392 {
393 AttributeType::StaticStruct()->CopyScriptStruct(OutAttributePtr, &Attribute);
394 }
395 }
396 });
397 }
398
399 /* Interpolate operation for blendable; non-step interpolated attribute types */
400 template <typename Type>
402 {
403 const AttributeType& TypedFrom = *(const AttributeType*)FromData;
404 const AttributeType& TypedTo = *(const AttributeType*)ToData;
405 AttributeType& Output = *(AttributeType*)InOutData;
406
408 Output.Interpolate(TypedTo, Alpha);
409
411 {
412 Output.Normalize();
413 }
414 }
415
416 /* Interpolate operation for non-blendable; step interpolated attribute types */
417 template <typename Type>
419 {
420 // Determine stepped value to copy
421 const void* CopySource = Alpha > 0.5f ? ToData : FromData;
422 // Using CopyScriptStruct as assignment operator might not be implemented for attribute type
423 AttributeType::StaticStruct()->CopyScriptStruct(InOutData, CopySource);
424 }
425 };
426
428 {
429 public:
431
433 virtual void Accumulate(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final
434 {
435 BlendData.ForEachUniqueAttribute([&, OutAttributes](FAttributeBlendData::TSingleRawIterator& It) -> void
436 {
437 while (It.Next())
438 {
439 const uint8* Attribute= It.GetValuePtr();
440 const FAttributeId& Identifier = It.GetIdentifier();
441 const int32 ExistingIndex = OutAttributes->IndexOfByKey(ScriptStructPtr.Get(), Identifier);
442 uint8* OutAttributePtr = OutAttributes->FindOrAdd(ScriptStructPtr.Get(), Identifier);
443
444 // 'Accumulate' value if the attribute did not yet exist, or based upon being the highest weighted attribute
445 const float AttributeWeight = It.GetWeight();
446 if (ExistingIndex == INDEX_NONE || AttributeWeight > 0.5f)
447 {
448 ScriptStructPtr.Get()->CopyScriptStruct(OutAttributePtr, Attribute);
449 }
450 }
451 });
452 };
453 virtual void Interpolate(const void* FromData, const void* ToData, float Alpha, void* InOutData) const final
454 {
455 // Determine stepped value to copy
456 const void* CopySource = Alpha > 0.5f ? ToData : FromData;
457 // Using CopyScriptStruct as assignment operator might not be implemented for attribute type
458 ScriptStructPtr.Get()->CopyScriptStruct(InOutData, CopySource);
459 };
460 virtual void Override(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final
461 {
462 BlendData.ForEachUniqueAttribute([&, OutAttributes](FAttributeBlendData::TSingleRawIterator& It) -> void
463 {
464 while (It.Next())
465 {
466 const uint8* Attribute = It.GetValuePtr();
467 const FAttributeId& Identifier = It.GetIdentifier();
468
469 // Find or add as the attribute might already exist, so Add would fail
470 uint8* OutAttribute = OutAttributes->FindOrAdd(ScriptStructPtr.Get(),Identifier);
471 ScriptStructPtr.Get()->CopyScriptStruct(OutAttribute, Attribute);
472 }
473 });
474 };
475 virtual void Blend(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final
476 {
477 BlendData.ForEachAttributeSet([&, OutAttributes](FAttributeBlendData::TAttributeSetRawIterator& It) -> void
478 {
481
482 // Not iterating over each attribute, but just picking highest weighted value
483 uint8* OutAttribute = OutAttributes->Add(ScriptStructPtr.Get(), Identifier);
484
485 ScriptStructPtr.Get()->CopyScriptStruct(OutAttribute, It.GetHighestWeightedValue());
486 });
487
488 BlendData.ForEachUniqueAttribute([&, OutAttributes](FAttributeBlendData::TSingleRawIterator& It) -> void
489 {
490 while (It.Next())
491 {
493
494 uint8* OutAttribute = OutAttributes->Add(ScriptStructPtr.Get(), Identifier);
495 ScriptStructPtr.Get()->CopyScriptStruct(OutAttribute, It.GetValuePtr());
496 }
497 });
498 };
499 virtual void BlendPerBone(const FAttributeBlendData& BlendData, FStackAttributeContainer* OutAttributes) const final
500 {
501 BlendData.ForEachAttributeSet([&, OutAttributes](FAttributeBlendData::TAttributeSetRawIterator& It) -> void
502 {
504 uint8* OutAttribute = OutAttributes->FindOrAdd(ScriptStructPtr.Get(), Identifier);
505 ScriptStructPtr.Get()->CopyScriptStruct(OutAttribute, It.GetHighestBoneWeightedValue());
506 });
507
508 BlendData.ForEachUniqueAttribute([&, OutAttributes](FAttributeBlendData::TSingleRawIterator& It) -> void
509 {
510 while (It.Next())
511 {
513 const int32 ExistingIndex = OutAttributes->IndexOfByKey(ScriptStructPtr.Get() ,Identifier);
514 const float BoneWeight = It.GetBoneWeight();
515
517 {
518 uint8* OutAttributePtr = OutAttributes->FindOrAdd(ScriptStructPtr.Get(), Identifier);
519 const uint8* Attribute = It.GetValuePtr();
520
521 // 'Blend' value if the attribute did not yet exist, or based upon being the highest weighted attribute
522 const bool bHighestWeight = It.IsHighestBoneWeighted();
524 {
525 ScriptStructPtr.Get()->CopyScriptStruct(OutAttributePtr, Attribute);
526 }
527 }
528 }
529 });
530 };
532 {
533 BlendData.ForEachUniqueAttribute([&, OutAdditiveAttributes](FAttributeBlendData::TSingleRawIterator& It) -> void
534 {
535 while (It.Next())
536 {
537 const uint8* Attribute = It.GetValuePtr();
538 const FAttributeId& Identifier = It.GetIdentifier();
539 const int32 ExistingIndex = OutAdditiveAttributes->IndexOfByKey(ScriptStructPtr.Get(), Identifier);
540 uint8* OutAttributePtr = OutAdditiveAttributes->FindOrAdd(ScriptStructPtr.Get(),Identifier);
541
542 // 'Accumulate' value if the attribute did not yet exist, or based upon being the highest weighted attribute
543 const float AttributeWeight = It.GetWeight();
544 if (ExistingIndex == INDEX_NONE)
545 {
546 ScriptStructPtr.Get()->CopyScriptStruct(OutAttributePtr, &Attribute);
547 }
548 }
549 });
550 };
551
552 protected:
554 };
555 }
556}
@ 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
ECustomAttributeBlendType
Definition CustomAttributes.h:19
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition EnableIf.h:20
Definition AttributeBlendOperator.h:428
virtual void Accumulate(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:433
virtual void Blend(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:475
virtual void BlendPerBone(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:499
virtual void ConvertToAdditive(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAdditiveAttributes) const final
Definition AttributeBlendOperator.h:531
virtual void Override(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:460
FNonBlendableAttributeBlendOperator(const UScriptStruct *InScriptStruct)
Definition AttributeBlendOperator.h:430
TWeakObjectPtr< const UScriptStruct > ScriptStructPtr
Definition AttributeBlendOperator.h:553
virtual void Interpolate(const void *FromData, const void *ToData, float Alpha, void *InOutData) const final
Definition AttributeBlendOperator.h:453
Definition IAttributeBlendOperator.h:16
Definition AttributeBlendOperator.h:21
virtual void ConvertToAdditive(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAdditiveAttributes) const final
Definition AttributeBlendOperator.h:29
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable, void >::Type ConvertToAdditive_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAdditiveAttributes) const
Definition AttributeBlendOperator.h:353
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable, void >::Type Blend_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:108
virtual void Accumulate(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:24
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable &&!TAttributeTypeTraits< AttributeType >::StepInterpolate, void >::Type Interpolate_Internal(const void *FromData, const void *ToData, float Alpha, void *InOutData) const
Definition AttributeBlendOperator.h:401
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable, void >::Type Override_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:278
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable, void >::Type Accumulate_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:329
virtual void Override(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:26
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable, void >::Type Override_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:253
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable, void >::Type ConvertToAdditive_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAdditiveAttributes) const
Definition AttributeBlendOperator.h:377
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable, void >::Type Blend_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:35
virtual void Blend(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:27
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable, void >::Type BlendPerBone_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:217
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable, void >::Type BlendPerBone_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:131
virtual void Interpolate(const void *FromData, const void *ToData, float Alpha, void *InOutData) const final
Definition AttributeBlendOperator.h:25
TEnableIf<!TAttributeTypeTraits< Type >::IsBlendable||TAttributeTypeTraits< AttributeType >::StepInterpolate, void >::Type Interpolate_Internal(const void *FromData, const void *ToData, float Alpha, void *InOutData) const
Definition AttributeBlendOperator.h:418
TEnableIf< TAttributeTypeTraits< Type >::IsBlendable, void >::Type Accumulate_Internal(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const
Definition AttributeBlendOperator.h:296
virtual void BlendPerBone(const FAttributeBlendData &BlendData, FStackAttributeContainer *OutAttributes) const final
Definition AttributeBlendOperator.h:28
Definition Class.h:1720
Definition AdvancedWidgetsModule.cpp:13
static bool IsFullWeight(float InWeight)
Definition AnimTypes.h:672
static bool IsRelevant(float InWeight)
Definition AnimTypes.h:666
Definition WeakObjectPtrTemplates.h:25
static ENGINE_API ECustomAttributeBlendType GetAttributeBlendType(const FName &InName)
Definition AttributesRuntime.cpp:602
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 uint8 * GetHighestBoneWeightedValue() const
Definition AttributeBlendData.h:319
const float GetBoneWeight() const
Definition AttributeBlendData.h:303
Definition AttributeBlendData.h:468
bool Next()
Definition AttributeBlendData.h:474
Definition AttributeBlendData.h:13
Definition AttributesContainer.h:27
Definition AttributesRuntime.h:40
int32 IndexOfByKey(const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:575
AttributeType * Add(const FAttributeId &InAttributeId, const AttributeType &Attribute)
Definition AttributesContainer.h:309
AttributeType * FindOrAdd(const FAttributeId &InAttributeId)
Definition AttributesContainer.h:367
Definition AttributeTraits.h:30