UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimDataModelHasher.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "Containers/Array.h"
9#include "Curves/RichCurve.h"
10#include "Misc/Guid.h"
11#include "Misc/SecureHash.h"
12
13#if WITH_EDITOR
14#include "Misc/StringBuilder.h"
15#include "String/BytesToHex.h"
16#endif
17
18namespace UE::Anim::DataModel
19{
20
30template <typename SubClassType>
32{
33public:
34 // Output functions; the base class does nothing and subclasses must override
35
36 void UpdateBytes(const uint8* Data, int32 Size, const TCHAR* Name)
37 {
38 checkf(false, TEXT("Subclass must implement"));
39 }
40 void BeginObject(const TCHAR* Name = nullptr)
41 {
42 checkf(false, TEXT("Subclass must implement"));
43 }
44 void EndObject()
45 {
46 checkf(false, TEXT("Subclass must implement"));
47 }
48
49 // Convenience functions; the base class implementation does not need to be overridden
50
51 template <typename T>
52 void UpdateData(const T& Data, const TCHAR* Name)
53 {
54 TypedThis()->UpdateBytes(reinterpret_cast<const uint8*>(&Data), sizeof(Data), Name);
55 }
56 template <typename T>
57 void UpdateArray(const TArray<T>& Array, const TCHAR* Name)
58 {
59 TypedThis()->UpdateBytes(reinterpret_cast<const uint8*>(Array.GetData()), Array.Num() * Array.GetTypeSize(), Name);
60 }
61 template <typename T>
63 {
64 TypedThis()->UpdateBytes(reinterpret_cast<const uint8*>(Array.GetData()), Array.Num() * Array.GetTypeSize(), Name);
65 }
66 void UpdateString(const FString& Data, const TCHAR* Name)
67 {
68 TypedThis()->UpdateBytes(reinterpret_cast<const uint8*>(*Data), Data.Len() * sizeof((*Data)[0]), Name);
69 }
75 void UpdateLegacyString(const FString& Data, const TCHAR* Name)
76 {
77 TypedThis()->UpdateString(Data, Name);
78 }
79
80 void UpdateRichCurve(const FRichCurve& Curve, const TCHAR* Name)
81 {
82 SubClassType& Hasher = *TypedThis();
83
84 Hasher.BeginObject(Name);
85 Hasher.UpdateData(Curve.DefaultValue, TEXT("D"));
86 Hasher.UpdateArray(Curve.GetConstRefOfKeys(), TEXT("K"));
87 Hasher.UpdateData(Curve.PreInfinityExtrap, TEXT("E"));
88 Hasher.UpdateData(Curve.PostInfinityExtrap, TEXT("O"));
89 Hasher.EndObject();
90 };
91
92 void UpdateVectorCurve(const FVectorCurve& VectorCurve, const TCHAR* Name)
93 {
94 SubClassType& Hasher = *TypedThis();
95
96 Hasher.BeginObject(Name);
97 for (int32 ChannelIndex = 0; ChannelIndex < 3; ++ChannelIndex)
98 {
99 Hasher.UpdateRichCurve(VectorCurve.FloatCurves[ChannelIndex], TEXT("C"));
100 }
101 Hasher.EndObject();
102 };
103
105 {
106 SubClassType& Hasher = *TypedThis();
107
108 Hasher.BeginObject(Name);
109 for (const FAnimatedBoneAttribute& Attribute : AnimatedBoneAttributes)
110 {
111 const UScriptStruct* TypeStruct = Attribute.Identifier.GetType();
113 const bool bHasTypeHash = TypeStruct->GetCppStructOps()->HasGetTypeHash();
114
115 Hasher.BeginObject();
116 Hasher.UpdateLegacyString(Attribute.Identifier.GetName().ToString(), TEXT("N"));
117 Hasher.UpdateLegacyString(Attribute.Identifier.GetBoneName().ToString(), TEXT("BN"));
118 Hasher.UpdateData(Attribute.Identifier.GetBoneIndex(), TEXT("BI"));
119 Hasher.UpdateLegacyString(TypeStruct->GetFName().ToString(), TEXT("T"));
120 Hasher.BeginObject(TEXT("K"));
121 for (const FAttributeKey& Key : Attribute.Curve.GetConstRefOfKeys())
122 {
123 Hasher.BeginObject();
124 Hasher.UpdateData(Key.Time, TEXT("T"));
125 if (bHasTypeHash)
126 {
127 const uint32 KeyHash = TypeStruct->GetStructTypeHash(Key.GetValuePtr<uint8>());
128 Hasher.UpdateData(KeyHash, TEXT("H"));
129 }
130 else
131 {
132 Hasher.UpdateBytes(Key.GetValuePtr<uint8>(), StructSize, TEXT("B"));
133 }
134 Hasher.EndObject();
135 }
136 Hasher.EndObject();
137 Hasher.EndObject();
138 }
139 Hasher.EndObject();
140 }
141
143 {
144 SubClassType& Hasher = *TypedThis();
145
146 Hasher.BeginObject(Name);
147 for (const FTransformCurve& Curve : TransformCurves)
148 {
149 Hasher.BeginObject();
150 Hasher.UpdateLegacyString(Curve.GetName().ToString(), TEXT("N"));
151 Hasher.UpdateVectorCurve(Curve.TranslationCurve, TEXT("T"));
152 Hasher.UpdateVectorCurve(Curve.RotationCurve, TEXT("R"));
153 Hasher.UpdateVectorCurve(Curve.ScaleCurve, TEXT("S"));
154 Hasher.EndObject();
155 }
156 Hasher.EndObject();
157 }
158
159private:
160 SubClassType* TypedThis()
161 {
162 return static_cast<SubClassType*>(this);
163 }
164
165};
166
168class FHasherSha : public FHasherBase<FHasherSha>
169{
170public:
171 void UpdateBytes(const uint8* Data, int32 Size, const TCHAR* Name)
172 {
173 Sha.Update(Data, Size);
174 }
175 void UpdateString(const FString& Data, const TCHAR* Name)
176 {
177 Sha.UpdateWithString(*Data, Data.Len());
178 }
179 void UpdateLegacyString(const FString& Data, const TCHAR* Name)
180 {
181 UpdateArray(Data.GetCharArray(), Name);
182 }
183 void BeginObject(const TCHAR* Name = nullptr)
184 {
185 }
187 {
188 }
189
191 {
192 checkf(!bFinalized, TEXT("Calling FinalGuid more than once is not implemented."));
193 bFinalized = true;
194 Sha.Final();
195
196 uint32 Hash[5];
197 Sha.GetHash(reinterpret_cast<uint8*>(Hash));
198 return FGuid(Hash[0] ^ Hash[4], Hash[1], Hash[2], Hash[3]);
199 }
200
201private:
202 FSHA1 Sha;
203 bool bFinalized = false;
204};
205
206#if WITH_EDITOR
208class FHasherCopyToText : public FHasherBase<FHasherCopyToText>
209{
210public:
211 void UpdateBytes(const uint8* Data, int32 Size, const TCHAR* Name)
212 {
213 Text << Divider << Name << Divider;
215 }
216 void UpdateString(const FString& Data, const TCHAR* Name)
217 {
218 Text << Divider << Name << Divider << Data;
219 }
220 void BeginObject(const TCHAR* Name = nullptr)
221 {
222 Text << Divider << (Name ? Name : TEXT("")) << Open;
223 }
224 void EndObject()
225 {
226 Text << Close;
227 }
228
230 {
231 return Text;
232 }
233 FString GetString() const
234 {
235 return FString(Text);
236 }
237private:
239 constexpr static TCHAR Divider = '_';
240 constexpr static TCHAR Open = '{';
241 constexpr static TCHAR Close = '}';
242};
243#endif
244
245
246} // namespace UE::Anim::DataModel
247
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
JsonWriter Close()
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SecureHash.h:314
CORE_API void Update(const uint8 *data, uint64 len)
Definition SecureHash.cpp:1205
CORE_API void UpdateWithString(const TCHAR *data, uint32 len)
Definition SecureHash.cpp:1240
CORE_API void GetHash(uint8 *puDest) const
Definition SecureHash.cpp:1269
CORE_API void Final()
Definition SecureHash.cpp:1245
Definition Array.h:670
Definition StringBuilder.h:509
Definition AnimDataModelHasher.h:32
void UpdateAnimatedBoneAttributes(TConstArrayView< FAnimatedBoneAttribute > AnimatedBoneAttributes, const TCHAR *Name)
Definition AnimDataModelHasher.h:104
void EndObject()
Definition AnimDataModelHasher.h:44
void UpdateData(const T &Data, const TCHAR *Name)
Definition AnimDataModelHasher.h:52
void UpdateRichCurve(const FRichCurve &Curve, const TCHAR *Name)
Definition AnimDataModelHasher.h:80
void UpdateVectorCurve(const FVectorCurve &VectorCurve, const TCHAR *Name)
Definition AnimDataModelHasher.h:92
void UpdateTransformCurves(TConstArrayView< FTransformCurve > TransformCurves, const TCHAR *Name)
Definition AnimDataModelHasher.h:142
void UpdateArray(TConstArrayView< T > Array, const TCHAR *Name)
Definition AnimDataModelHasher.h:62
void UpdateLegacyString(const FString &Data, const TCHAR *Name)
Definition AnimDataModelHasher.h:75
void UpdateArray(const TArray< T > &Array, const TCHAR *Name)
Definition AnimDataModelHasher.h:57
void UpdateBytes(const uint8 *Data, int32 Size, const TCHAR *Name)
Definition AnimDataModelHasher.h:36
void BeginObject(const TCHAR *Name=nullptr)
Definition AnimDataModelHasher.h:40
void UpdateString(const FString &Data, const TCHAR *Name)
Definition AnimDataModelHasher.h:66
Definition AnimDataModelHasher.h:169
void BeginObject(const TCHAR *Name=nullptr)
Definition AnimDataModelHasher.h:183
void EndObject()
Definition AnimDataModelHasher.h:186
FGuid FinalGuid()
Definition AnimDataModelHasher.h:190
void UpdateBytes(const uint8 *Data, int32 Size, const TCHAR *Name)
Definition AnimDataModelHasher.h:171
void UpdateString(const FString &Data, const TCHAR *Name)
Definition AnimDataModelHasher.h:175
void UpdateLegacyString(const FString &Data, const TCHAR *Name)
Definition AnimDataModelHasher.h:179
Definition Class.h:1720
UE_FORCEINLINE_HINT int32 GetPropertiesSize() const
Definition Class.h:763
Definition IAnimationDataModel.h:16
void BytesToHex(TConstArrayView< uint8 > Bytes, ANSICHAR *OutHex)
Definition BytesToHex.cpp:27
Definition IAnimationDataModel.h:105
Definition AttributeCurve.h:23
Definition Guid.h:109
Definition RichCurve.h:200
Definition AnimCurveTypes.h:308
Definition AnimCurveTypes.h:256
FRichCurve FloatCurves[3]
Definition AnimCurveTypes.h:269