UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AttributesContainer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7
8#include "UObject/NameTypes.h"
9#include "UObject/Class.h"
11
12#include "Animation/AnimTypes.h"
14#include "BoneContainer.h"
15
16#include "BoneIndices.h"
17
19
20namespace UE
21{
22 namespace Anim
23 {
24 static FName BoneAttributeNamespace("bone");
27 {
28 FAttributeId(const FName& InName, const FCompactPoseBoneIndex& InCompactBoneIndex) : Namespace(BoneAttributeNamespace), Name(InName), Index(InCompactBoneIndex.GetInt()) {}
30
31 bool operator==(const FAttributeId& Other) const
32 {
33 return Index == Other.Index && Name == Other.Name && Namespace == Other.Namespace;
34 }
35
36 int32 GetIndex() const { return Index; }
37 const FName& GetName() const { return Name; }
38 const FName& GetNamespace() const { return Namespace; }
39 protected:
43 };
44
45 namespace Conversion
46 {
47 template<typename BoneIndexTypeA, typename BoneIndexTypeB>
48 BoneIndexTypeB MakeIndex(BoneIndexTypeA BoneIndex, const FBoneContainer& BoneContainer)
49 {
50 return BoneIndexTypeB();
51 }
52
53 template<>
54 inline FMeshPoseBoneIndex MakeIndex(FCompactPoseBoneIndex BoneIndex, const FBoneContainer& BoneContainer)
55 {
56 // Guard against invalid compact-pose indexing
57 const bool bValidBoneIndex = BoneContainer.GetBoneIndicesArray().IsValidIndex(BoneIndex.GetInt());
58 return bValidBoneIndex ? BoneContainer.MakeMeshPoseIndex(BoneIndex) : FMeshPoseBoneIndex(INDEX_NONE);
59 }
60
61 template<>
62 inline FCompactPoseBoneIndex MakeIndex(FMeshPoseBoneIndex BoneIndex, const FBoneContainer& BoneContainer)
63 {
64 return BoneContainer.MakeCompactPoseIndex(BoneIndex);
65 }
66 }
67
69 template<class BoneIndexType, typename InAllocator>
71 {
73 template <typename OtherAllocator>
75 {
76 AttributeIdentifiers = Other.AttributeIdentifiers;
77 UniqueTypedBoneIndices = Other.UniqueTypedBoneIndices;
78 UniqueTypes = Other.UniqueTypes;
79 Values.Empty(Other.Values.Num());
80 const int32 NumTypes = UniqueTypes.Num();
81 for (int32 TypeIndex = 0; TypeIndex < NumTypes; ++TypeIndex)
82 {
83 const TArray<TWrappedAttribute<OtherAllocator>>& Array = Other.Values[TypeIndex];
85
88 {
89 TWrappedAttribute<InAllocator>& StructData = ValuesArray.Add_GetRef(WeakScriptStruct.Get());
90 WeakScriptStruct->CopyScriptStruct(StructData.template GetPtr<void>(), StructOnScope.template GetPtr<void>());
91 }
92 }
93 }
94
95 public:
96 template<class OtherBoneIndexType, typename OtherAllocator>
98 {
99 UniqueTypes = Other.UniqueTypes;
100 AttributeIdentifiers.Empty(Other.AttributeIdentifiers.Num());
101 UniqueTypedBoneIndices.Empty(Other.UniqueTypedBoneIndices.Num());
102 Values.Empty(Other.Values.Num());
103
104 const int32 NumTypes = Other.UniqueTypedBoneIndices.Num();
105 for (int32 TypeIndex = 0; TypeIndex < NumTypes; ++TypeIndex)
106 {
108 const TArray<FAttributeId>& OtherTypeAttributeIdentifiers = Other.AttributeIdentifiers[TypeIndex];
110
111 // Populate an array entry for the type
115
117 for (int32 AttributeIndex = 0; AttributeIndex < NumOtherAttributes; ++AttributeIndex)
118 {
119 const FAttributeId& Id = OtherTypeAttributeIdentifiers[AttributeIndex];
121
122 // If the bone index was mapped successfully - add the remapped attribute
123 if (const BoneIndexType* MyIndexPtr = IndexMapping.Find(OtherBoneIndexType(Id.GetIndex())))
124 {
125 FAttributeId MappedId(Id.GetName(), MyIndexPtr->GetInt(), Id.GetNamespace());
127 TWrappedAttribute<InAllocator>& StructData = ValuesArray.Add_GetRef(WeakScriptStruct.Get());
128 WeakScriptStruct->CopyScriptStruct(StructData.template GetPtr<void>(), Value.template GetPtr<void>());
129
130 TypeBoneIndices.AddUnique(MyIndexPtr->GetInt());
131 }
132 }
133 }
134 }
135
136 template<class OtherBoneIndexType, typename OtherAllocator>
138 {
139 UniqueTypes = Other.UniqueTypes;
140 AttributeIdentifiers.Empty(Other.AttributeIdentifiers.Num());
141 UniqueTypedBoneIndices.Empty(Other.UniqueTypedBoneIndices.Num());
142 Values.Empty(Other.Values.Num());
143
144 const int32 NumTypes = Other.UniqueTypedBoneIndices.Num();
145 for (int32 TypeIndex = 0; TypeIndex < NumTypes; ++TypeIndex)
146 {
147 // Generate mapping for all contained unique bones to other container its index type
149 const TArray<int32>& OtherTypeBoneIndices = Other.UniqueTypedBoneIndices[TypeIndex];
151 {
153 BoneIndexType MyIndex = Conversion::MakeIndex<OtherBoneIndexType, BoneIndexType>(OtherIndex, BoneContainer);
154 if (MyIndex.IsValid())
155 {
157 }
158 }
159
161 const TArray<FAttributeId>& OtherTypeAttributeIdentifiers = Other.AttributeIdentifiers[TypeIndex];
163
164 // Populate an array entry for the type
168
170 for (int32 AttributeIndex = 0; AttributeIndex < NumOtherAttributes; ++AttributeIndex)
171 {
172 const FAttributeId& Id = OtherTypeAttributeIdentifiers[AttributeIndex];
174
175 // If the bone index was mapped successfully - add the remapped attribute
176 if (const BoneIndexType* MyIndexPtr = IndexMapping.Find(Id.GetIndex()))
177 {
178 FAttributeId MappedId(Id.GetName(), MyIndexPtr->GetInt(), Id.GetNamespace());
180 TWrappedAttribute<InAllocator>& StructData = ValuesArray.Add_GetRef(WeakScriptStruct.Get());
181 WeakScriptStruct->CopyScriptStruct(StructData.template GetPtr<void>(), Value.template GetPtr<void>());
182
183 TypeBoneIndices.AddUnique(MyIndexPtr->GetInt());
184 }
185 }
186 }
187 }
188
191 {
193 if (&Other != this)
194 {
195 AttributeIdentifiers = Other.AttributeIdentifiers;
196 UniqueTypedBoneIndices = Other.UniqueTypedBoneIndices;
197 UniqueTypes = Other.UniqueTypes;
198 Values.Empty(Other.Values.Num());
199
200 const int32 NumTypes = UniqueTypes.Num();
201 for (int32 TypeIndex = 0; TypeIndex < NumTypes; ++TypeIndex)
202 {
203 const TArray<TWrappedAttribute<InAllocator>>& Array = Other.Values[TypeIndex];
205
208 {
209 TWrappedAttribute<InAllocator>& StructData = ValuesArray.Add_GetRef(WeakScriptStruct.Get());
210 WeakScriptStruct->CopyScriptStruct(StructData.template GetPtr<void>(), StructOnScope.template GetPtr<void>());
211 }
212 }
213 }
214 }
215
218 {
219 AttributeIdentifiers = MoveTemp(Other.AttributeIdentifiers);
220 UniqueTypedBoneIndices = MoveTemp(Other.UniqueTypedBoneIndices);
221 Values = MoveTemp(Other.Values);
222 UniqueTypes = MoveTemp(Other.UniqueTypes);
223 }
224
226 bool ContainsData() const
227 {
228 return Values.Num() != 0;
229 }
230
232 void Empty()
233 {
234 AttributeIdentifiers.Empty();
236 Values.Empty();
238 }
239
241 {
243 if (UniqueTypes.Num() == Other.UniqueTypes.Num())
244 {
246 {
248
249 const int32 OtherTypeIndex = Other.FindTypeIndex(ThisType.Get());
250
253 {
255 if (Values[ThisTypeIndex].Num() == Other.Values[OtherTypeIndex].Num())
256 {
258 {
260
262 const int32 OtherAttributeIndex = Other.AttributeIdentifiers[OtherTypeIndex].IndexOfByKey(ThisAttributeId);
264 {
267
269 if (!ThisType->CompareScriptStruct(ThisAttributeValue.template GetPtr<void>(), OtherAttributeValue.template GetPtr<void>(), 0))
270 {
271 return true;
272 }
273 }
274 else
275 {
276 return true;
277 }
278 }
279 }
280 else
281 {
282 return true;
283 }
284 }
285 else
286 {
287 return true;
288 }
289 }
290 }
291 else
292 {
293 return true;
294 }
295
296 // If absolutely everything matches
297 return false;
298 }
299
308 template<typename AttributeType>
309 AttributeType* Add(const FAttributeId& InAttributeId, const AttributeType& Attribute)
310 {
311 AttributeType* AddedPtr = (AttributeType*)Add(AttributeType::StaticStruct(), InAttributeId);
312 if (AddedPtr)
313 {
314 AttributeType::StaticStruct()->CopyScriptStruct(AddedPtr, &Attribute);
315 }
316
317 return AddedPtr;
318 }
319
329 {
330 const int32 TypeIndex = FindOrAddTypeIndex(InScriptStruct);
331
333
335
336 // Should only add an attribute once
338 {
339 int32 NewIndex = INDEX_NONE;
340
342
343 UniqueTypedBoneIndices[TypeIndex].AddUnique(InAttributeId.GetIndex());
344
346 NewIndex = TypedArray.Add(InScriptStruct);
347 TWrappedAttribute<InAllocator>& StructData = TypedArray[NewIndex];
348 InScriptStruct->InitializeStruct(StructData.template GetPtr<void>());
349
350 // Ensure arrays match in size
351 ensure(AttributeIds.Num() == TypedArray.Num());
352
353 return StructData.template GetPtr<uint8>();
354 }
355
356 return nullptr;
357 }
358
366 template<typename AttributeType>
367 AttributeType* FindOrAdd(const FAttributeId& InAttributeId)
368 {
369 return (AttributeType*)FindOrAdd(AttributeType::StaticStruct(), InAttributeId);
370 }
371
381 {
382 const int32 TypeIndex = FindOrAddTypeIndex(InScriptStruct);
384
386
387 ensure(Values.IsValidIndex(TypeIndex));
389
390 // Should only add an attribute once
391 if (AttributeIndex == INDEX_NONE)
392 {
394
395 UniqueTypedBoneIndices[TypeIndex].AddUnique(InAttributeId.GetIndex());
396
397 AttributeIndex = TypedArray.Add(InScriptStruct);
398 TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
399 InScriptStruct->InitializeStruct(StructData.template GetPtr<void>());
400
401 // Ensure arrays match in size
402 ensure(AttributeIds.Num() == TypedArray.Num());
403
404 return StructData.template GetPtr<uint8>();
405 }
406
407 ensure(TypedArray.IsValidIndex(AttributeIndex));
408 TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
409
410 return StructData.template GetPtr<uint8>();
411 }
412
420 template<typename AttributeType>
421 AttributeType* Find(const FAttributeId& InAttributeId)
422 {
423 return (AttributeType*)Find(AttributeType::StaticStruct(), InAttributeId);
424 }
425
435 {
436 const int32 TypeIndex = FindTypeIndex(InScriptStruct);
437 if (TypeIndex != INDEX_NONE)
438 {
440
441 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
442 ensure(Values.IsValidIndex(TypeIndex));
444
445 if (AttributeIndex != INDEX_NONE)
446 {
447 ensure(TypedArray.IsValidIndex(AttributeIndex));
448 TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
449 return StructData.template GetPtr<uint8>();
450 }
451 }
452
453 return nullptr;
454 }
455
463 template<typename AttributeType>
464 const AttributeType* Find(const FAttributeId& InAttributeId) const
465 {
466 return (AttributeType*)Find(AttributeType::StaticStruct(), InAttributeId);
467 }
468
478 {
479 const int32 TypeIndex = FindTypeIndex(InScriptStruct);
480 if (TypeIndex != INDEX_NONE)
481 {
483 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
484
485 ensure(Values.IsValidIndex(TypeIndex));
487
488 if (AttributeIndex != INDEX_NONE)
489 {
490 ensure(TypedArray.IsValidIndex(AttributeIndex));
491 const TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
492 return StructData.template GetPtr<uint8>();
493 }
494 }
495
496 return nullptr;
497 }
498
507 template<typename AttributeType>
509 {
510 const int32 TypeIndex = FindTypeIndex(AttributeType::StaticStruct());
511 if (TypeIndex != INDEX_NONE)
512 {
514 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
515
516 ensure(Values.IsValidIndex(TypeIndex));
518
519 if (AttributeIndex != INDEX_NONE)
520 {
521 ensure(TypedArray.IsValidIndex(AttributeIndex));
522 TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
523 return *(AttributeType*)(TypedArray[AttributeIndex].template GetPtr<void>());
524 }
525 else
526 {
527 checkf(false, TEXT("Failed TAttributeContainer::FindChecked"));
528 }
529 }
530
531 checkf(false, TEXT("Failed TAttributeContainer::FindChecked"));
532 return AttributeType();
533 }
534
543 template<typename AttributeType>
544 const AttributeType& FindChecked(const FAttributeId& InAttributeId) const
545 {
546 const int32 TypeIndex = FindTypeIndex(AttributeType::StaticStruct());
547 if (TypeIndex != INDEX_NONE)
548 {
550 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
551
552 ensure(Values.IsValidIndex(TypeIndex));
554
555 if (AttributeIndex != INDEX_NONE)
556 {
557 ensure(TypedArray.IsValidIndex(AttributeIndex));
558 const TWrappedAttribute<InAllocator>& StructData = TypedArray[AttributeIndex];
559 return *(const AttributeType*)(TypedArray[AttributeIndex].template GetPtr<void>());
560 }
561 }
562
563 checkf(false, TEXT("Failed TAttributeContainer::FindChecked"));
564 return AttributeType();
565 }
566
574 template<typename AttributeType>
576 {
577 const int32 TypeIndex = FindTypeIndex(AttributeType::StaticStruct());
578 if (TypeIndex != INDEX_NONE)
579 {
581
582 // Early out if for this bone index no attributes are currently contained
583 if (UniqueBoneIndices.Contains(InAttributeId.GetIndex()))
584 {
586 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
587
588 return AttributeIndex;
589 }
590 }
591
592 return INDEX_NONE;
593 }
594
603 {
604 const int32 TypeIndex = FindTypeIndex(InScriptStruct);
605 if (TypeIndex != INDEX_NONE)
606 {
608
609 // Early out if for this bone index no attributes are currently contained
610 if (UniqueBoneIndices.Contains(InAttributeId.GetIndex()))
611 {
613 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
614
615 return AttributeIndex;
616 }
617 }
618
619 return INDEX_NONE;
620 }
621
629 template<typename AttributeType>
631 {
632 return Remove(AttributeType::StaticStruct(), InAttributeId);
633 }
634
643 {
644 const int32 TypeIndex = FindTypeIndex(InScriptStruct);
645 if (TypeIndex != INDEX_NONE)
646 {
648
649 const int32 AttributeIndex = AttributeIds.IndexOfByKey(InAttributeId);
650
651 // Can only remove if it exists
652 if (AttributeIndex != INDEX_NONE)
653 {
655
656 // If removing the last one, remove all data for the attribute type
657 if (TypedArray.Num() == 1)
658 {
659 UniqueTypes.RemoveAtSwap(TypeIndex);
661 AttributeIdentifiers.RemoveAtSwap(TypeIndex);
662 Values.RemoveAtSwap(TypeIndex);
663
666 check(Values.Num() == UniqueTypes.Num());
667 }
668 else
669 {
670 AttributeIds.RemoveAtSwap(AttributeIndex);
671 TypedArray.RemoveAtSwap(AttributeIndex);
672 }
673
674 return true;
675 }
676 }
677
678
679 return false;
680 }
681
682
688 template<typename AttributeType>
690 {
691 return RemoveAll(AttributeType::StaticStruct());
692 }
693
700 {
701 const int32 TypeIndex = FindTypeIndex(InScriptStruct);
702 if (TypeIndex != INDEX_NONE)
703 {
704 AttributeIdentifiers.RemoveAtSwap(TypeIndex);
705
707 AttributeIdentifiers.RemoveAtSwap(TypeIndex);
708 Values.RemoveAtSwap(TypeIndex);
709
712 ensure(Values.Num() == UniqueTypes.Num());
713
714 return true;
715 }
716
717 return false;
718 }
719
720 /*
721 * @return The TypeIndex for the specified InScriptStruct type, INDEX_NONE if not found
722 */
727
728 /*
729 * @return Array of all the contained keys for the provided TypeIndex
730 */
731 const TArray<FAttributeId>& GetKeys(int32 TypeIndex) const { return AttributeIdentifiers[TypeIndex]; }
732
733 /*
734 * @return Array of all the contained values for the provided TypeIndex
735 */
736 const TArray<TWrappedAttribute<InAllocator>>& GetValues(int32 TypeIndex) const { return Values[TypeIndex]; }
737
738 /*
739 * @return Array of all the contained attribute types (UScriptStruct)
740 */
742
743 /*
744 * Populate out parameter OutAttributeKeyNames for all contained attribute key names
745 *
746 * @return bool, whether or not any attribute key names were present
747 */
748 template<typename ArrayAllocator>
750 {
751 if (!AttributeIdentifiers.IsEmpty())
752 {
754 {
756 {
757 OutAttributeKeyNames.AddUnique(AttributeId.GetName());
758 }
759 }
760
761 return true;
762 }
763
764 return false;
765 }
766
767 /*
768 * @return Unique bone indices for all contained entries of a specific attribute type
769 */
770 const TArray<int32>& GetUniqueTypedBoneIndices(int32 TypeIndex) const { return UniqueTypedBoneIndices[TypeIndex]; }
771
772 /*
773 * @return total number of attributes
774 */
775 int32 Num() const
776 {
777 int32 NumAttributes = 0;
779 {
780 NumAttributes += AttributesPerType.Num();
781 }
782
783 return NumAttributes;
784 }
785
786 protected:
787
788 /*
789 * @return Array of all the contained values for the provided TypeIndex
790 */
792
793 /*
794 * @return Array of all the contained keys for the provided TypeIndex
795 */
797
800 {
801 const int32 OldNum = UniqueTypes.Num();
802 // Technically we could have avoided using const cast here if we made UniqueTypes use const UScriptStruct*
803 // but a bit of refactoring is required
804 const int32 TypeIndex = UniqueTypes.AddUnique(const_cast<UScriptStruct*>(InScriptStruct));
805
806 if (UniqueTypes.Num() > OldNum)
807 {
809 AttributeIdentifiers.AddDefaulted();
810 Values.AddDefaulted();
813 ensure(Values.Num() == UniqueTypes.Num());
814 }
815
816 return TypeIndex;
817 }
818 protected:
824
825 template <typename OtherBoneIndexType, typename OtherAllocator>
826 friend struct TAttributeContainer;
827
828 template<class OtherBoneIndexType, typename OtherAllocator>
830 };
831 }
832}
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
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
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition NameTypes.h:617
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
SizeType AddDefaulted()
Definition Array.h:2795
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
SizeType IndexOfByKey(const KeyType &Key) const
Definition Array.h:1403
ElementType & AddDefaulted_GetRef() UE_LIFETIMEBOUND
Definition Array.h:2815
UE_FORCEINLINE_HINT SizeType AddUnique(ElementType &&Item)
Definition Array.h:2993
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Add_GetRef(ElementType &&Item) UE_LIFETIMEBOUND
Definition Array.h:2724
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition UnrealString.h.inl:34
Definition Class.h:1720
BoneIndexTypeB MakeIndex(BoneIndexTypeA BoneIndex, const FBoneContainer &BoneContainer)
Definition AttributesContainer.h:48
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition BoneContainer.h:192
const TArray< FBoneIndexType > & GetBoneIndicesArray() const
Definition BoneContainer.h:342
FCompactPoseBoneIndex MakeCompactPoseIndex(const FMeshPoseBoneIndex &BoneIndex) const
Definition BoneContainer.h:654
FMeshPoseBoneIndex MakeMeshPoseIndex(const FCompactPoseBoneIndex &BoneIndex) const
Definition BoneContainer.h:649
int32 GetInt() const
Definition BoneIndices.h:14
Definition BoneIndices.h:63
Definition BoneIndices.h:71
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE T * Get(bool bEvenIfPendingKill) const
Definition WeakObjectPtrTemplates.h:132
Definition AttributesContainer.h:27
int32 Index
Definition AttributesContainer.h:42
FName Namespace
Definition AttributesContainer.h:40
FName Name
Definition AttributesContainer.h:41
FAttributeId(const FName &InName, int32 InIndex, const FName &InNamespace)
Definition AttributesContainer.h:29
const FName & GetNamespace() const
Definition AttributesContainer.h:38
int32 GetIndex() const
Definition AttributesContainer.h:36
FAttributeId(const FName &InName, const FCompactPoseBoneIndex &InCompactBoneIndex)
Definition AttributesContainer.h:28
bool operator==(const FAttributeId &Other) const
Definition AttributesContainer.h:31
const FName & GetName() const
Definition AttributesContainer.h:37
Definition AttributesRuntime.h:47
Definition AttributesContainer.h:71
int32 Num() const
Definition AttributesContainer.h:775
void CopyFrom(const TAttributeContainer< BoneIndexType, OtherAllocator > &Other)
Definition AttributesContainer.h:74
const AttributeType & FindChecked(const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:544
bool Remove(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId)
Definition AttributesContainer.h:642
int32 FindOrAddTypeIndex(const UScriptStruct *InScriptStruct)
Definition AttributesContainer.h:799
uint8 * Add(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId)
Definition AttributesContainer.h:328
int32 FindTypeIndex(const UScriptStruct *InScriptStruct) const
Definition AttributesContainer.h:723
int32 IndexOfByKey(const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:575
void CopyFrom(const TAttributeContainer< BoneIndexType, InAllocator > &Other)
Definition AttributesContainer.h:190
const TArray< TWeakObjectPtr< UScriptStruct > > & GetUniqueTypes() const
Definition AttributesContainer.h:741
const TArray< int32 > & GetUniqueTypedBoneIndices(int32 TypeIndex) const
Definition AttributesContainer.h:770
AttributeType * Find(const FAttributeId &InAttributeId)
Definition AttributesContainer.h:421
void MoveFrom(TAttributeContainer< BoneIndexType, InAllocator > &Other)
Definition AttributesContainer.h:217
const AttributeType * Find(const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:464
AttributeType * Add(const FAttributeId &InAttributeId, const AttributeType &Attribute)
Definition AttributesContainer.h:309
bool Remove(const FAttributeId &InAttributeId)
Definition AttributesContainer.h:630
AttributeType & FindChecked(const FAttributeId &InAttributeId)
Definition AttributesContainer.h:508
AttributeType * FindOrAdd(const FAttributeId &InAttributeId)
Definition AttributesContainer.h:367
void CopyFrom(const TAttributeContainer< OtherBoneIndexType, OtherAllocator > &Other, const FBoneContainer &BoneContainer)
Definition AttributesContainer.h:137
int32 IndexOfByKey(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:602
TArray< FAttributeId > & GetKeysInternal(int32 TypeIndex)
Definition AttributesContainer.h:796
bool operator!=(const TAttributeContainer< BoneIndexType, InAllocator > &Other)
Definition AttributesContainer.h:240
uint8 * Find(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId)
Definition AttributesContainer.h:434
const TArray< FAttributeId > & GetKeys(int32 TypeIndex) const
Definition AttributesContainer.h:731
bool RemoveAll()
Definition AttributesContainer.h:689
TArray< TArray< int32 > > UniqueTypedBoneIndices
Definition AttributesContainer.h:820
bool ContainsData() const
Definition AttributesContainer.h:226
TArray< TWrappedAttribute< InAllocator > > & GetValuesInternal(int32 TypeIndex)
Definition AttributesContainer.h:791
TArray< TArray< FAttributeId > > AttributeIdentifiers
Definition AttributesContainer.h:821
const TArray< TWrappedAttribute< InAllocator > > & GetValues(int32 TypeIndex) const
Definition AttributesContainer.h:736
TArray< TArray< TWrappedAttribute< InAllocator > > > Values
Definition AttributesContainer.h:822
const uint8 * Find(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId) const
Definition AttributesContainer.h:477
void CopyFrom(const TAttributeContainer< OtherBoneIndexType, OtherAllocator > &Other, const TMap< OtherBoneIndexType, BoneIndexType > &IndexMapping)
Definition AttributesContainer.h:97
void Empty()
Definition AttributesContainer.h:232
bool GetAllKeyNames(TArray< FName, ArrayAllocator > &OutAttributeKeyNames) const
Definition AttributesContainer.h:749
uint8 * FindOrAdd(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId)
Definition AttributesContainer.h:380
bool RemoveAll(const UScriptStruct *InScriptStruct, const FAttributeId &InAttributeId)
Definition AttributesContainer.h:699
TArray< TWeakObjectPtr< UScriptStruct > > UniqueTypes
Definition AttributesContainer.h:823
Definition WrappedAttribute.h:16