UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimCompress.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
10#include "CoreMinimal.h"
12#include "UObject/Object.h"
13#include "Templates/Function.h"
14#include "Templates/Greater.h"
17#include "AnimationUtils.h"
18#include "AnimEnums.h"
20#include "AnimCompress.generated.h"
21
23
24//Helper function for ddc key generation
26
27// Logic for tracking top N error items for later display
28template<typename DataType, typename SortType, int MaxItems>
30{
31public:
33 : CurrentLowestError(0.f)
34 {
35 Items.Reserve(MaxItems);
36 }
37
39 {
40 return Items.Num() < MaxItems || NewError > CurrentLowestError;
41 }
42
43 template <typename... ArgsType>
45 {
46 bool bModified = false;
47
48 if (Items.Num() < MaxItems)
49 {
50 Items.Emplace(Forward<ArgsType>(Args)...);
51 bModified = true;
52 }
53 else if(NewError > CurrentLowestError)
54 {
55 Items[MaxItems - 1] = DataType(Forward<ArgsType>(Args)...);
56 bModified = true;
57 }
58
59 if (bModified)
60 {
61 Algo::Sort(Items, TGreater<>());
62 CurrentLowestError = Items.Last().GetErrorValue();
63 }
64 }
65
67 {
68 for (int ItemIndex = 0; ItemIndex < Items.Num(); ++ItemIndex)
69 {
70 UE_LOG(LogAnimationCompression, Display, TEXT("%i) %s"), ItemIndex+1, *Items[ItemIndex].ToText().ToString());
71 }
72 }
73
74 const DataType& GetMaxErrorItem() const
75 {
76 return Items[0];
77 }
78
79 bool IsValid() const
80 {
81 return Items.Num() > 0;
82 }
83
84private:
85 //Storage of tracked items
86 TArray<DataType> Items;
87
88 //For ease cache current lowest error value
89 SortType CurrentLowestError;
90};
91
93{
101
109
110 bool operator<(const FErrorTrackerWorstBone& Rhs) const
111 {
112 return BoneError < Rhs.BoneError;
113 }
114
115 float GetErrorValue() const { return BoneError; }
116
117 FText ToText() const
118 {
120 Options.MinimumIntegralDigits = 1;
121 Options.MinimumFractionalDigits = 3;
122
124 Args.Add(TEXT("BoneError"), FText::AsNumber(BoneError, &Options));
125 Args.Add(TEXT("BoneErrorAnimName"), FText::FromName(BoneErrorAnimName));
126 Args.Add(TEXT("BoneErrorBoneName"), FText::FromName(BoneErrorBoneName));
127 Args.Add(TEXT("BoneErrorBone"), BoneErrorBone);
128 Args.Add(TEXT("BoneErrorTime"), FText::AsNumber(BoneErrorTime, &Options));
129
130 return FText::Format(NSLOCTEXT("Engine", "CompressionWorstBoneSummary", "{BoneError} in Animation {BoneErrorAnimName}, Bone : {BoneErrorBoneName}(#{BoneErrorBone}), at Time {BoneErrorTime}"), Args);
131 }
132
133 // Error of this bone
135
136 // Time in the sequence that the error occurred at
138
139 // Bone index the error occurred on
141
142 // Bone name the error occurred on
144
145 // Animation the error occurred on
147};
148
150{
152 : AvgError(0)
153 , AnimName(NAME_None)
154 {}
155
160
162 {
163 return AvgError < Rhs.AvgError;
164 }
165
166 float GetErrorValue() const { return AvgError; }
167
168 FText ToText() const
169 {
171 Options.MinimumIntegralDigits = 1;
172 Options.MinimumFractionalDigits = 3;
173
175 Args.Add(TEXT("AvgError"), FText::AsNumber(AvgError, &Options));
176 Args.Add(TEXT("AnimName"), FText::FromName(AnimName));
177
178 return FText::Format(NSLOCTEXT("Engine", "CompressionWorstAnimationSummary", "{AvgError} in Animation {AnimName}"), Args);
179 }
180
181private:
182
183 // Average error of this animation
184 float AvgError;
185
186 // Animation being tracked
187 FName AnimName;
188};
189
191{
192public:
194
196
198
200
201private:
202 bool bEnabled;
203 bool bUsed;
204 bool bPerformedCompression;
205 int64 TotalRaw;
206 int64 TotalBeforeCompressed;
207 int64 TotalAfterCompressed;
208 int32 NumberOfAnimations;
209
210 // Total time spent compressing animations
211 double TotalCompressionExecutionTime;
212
213 // Stats across all animations
214 float ErrorTotal;
215 float ErrorCount;
216 float AverageError;
217
218 // Track the largest errors on a single bone
220
221 // Track the animations with the largest average error
223};
224
226// FAnimCompressContext - Context information / storage for use during
227// animation compression
228
229struct UE_DEPRECATED(5.2, "FAnimCompressContext has been deprecated") FAnimCompressContext;
231{
232private:
233 FCompressionMemorySummary CompressionSummary;
234
235 void GatherPreCompressionStats(const FString& Name, int32 RawSize, int32 PreviousCompressionSize) {}
236
237 void GatherPostCompressionStats(const FCompressedAnimSequence& CompressedData, const TArray<FBoneData>& BoneData, const FName AnimFName, double CompressionTime, bool bInPerformedCompression) {}
238public:
242
244 : CompressionSummary(bInOutput)
245 , AnimIndex(0)
248 {}
249
250 // If we are duping a compression context we don't want the CompressionSummary to output
252 : CompressionSummary(false)
253 , AnimIndex(Rhs.AnimIndex)
255 , bOutput(Rhs.bOutput)
256 {}
257
258 // Unlike the copy constructor, this will copy the CompressionSummary, but the class is deprecated anyway
260
261 friend class FAnimationUtils;
263 friend class UAnimSequence;
264};
265
266#if WITH_EDITOR
267namespace UE
268{
269 namespace Anim
270 {
271 namespace Compression
272 {
273 // This is a version string that mimics the old versioning scheme. If you
274 // want to bump this version, generate a new guid using VS->Tools->Create GUID and
275 // return it here. Ex.
276 static const FString AnimationCompressionVersionString = TEXT("0439926D560447329623BE4394FA11A6");
277
279 {
281 {
282 bool bExpected = false;
283 check(ScopeExists.compare_exchange_strong(bExpected, true));
284 CompressionSummary = MakeUnique<FCompressionMemorySummary>(true);
285 }
286
288 {
289 bool bExpected = true;
290 check(ScopeExists.compare_exchange_strong(bExpected, false));
291 CompressionSummary.Reset();
292 }
293
295 {
296 return ScopeExists.load();
297 }
298
300 {
301 check(ScopeExists.load());
302 return *CompressionSummary.Get();
303 }
304
305 static ENGINE_API std::atomic<bool> ScopeExists;
306 static ENGINE_API TUniquePtr<FCompressionMemorySummary> CompressionSummary;
307 };
308 }
309 }
310}
311#endif // WITH_EDITOR
312
313
316{
318
319
320 UPROPERTY()
321 uint32 bNeedsSkeleton:1;
322
324 UPROPERTY(Category = Compression, EditAnywhere)
325 TEnumAsByte<AnimationCompressionFormat> TranslationCompressionFormat;
326
328 UPROPERTY(Category = Compression, EditAnywhere)
329 TEnumAsByte<AnimationCompressionFormat> RotationCompressionFormat;
330
332 UPROPERTY(Category = Compression, EditAnywhere)
333 TEnumAsByte<AnimationCompressionFormat> ScaleCompressionFormat;
334
335public:
336#if WITH_EDITORONLY_DATA
339#endif
340
341 virtual TUniquePtr<ICompressedAnimData> AllocateAnimData() const override;
342
343 virtual void ByteSwapIn(ICompressedAnimData& AnimData, TArrayView<uint8> CompressedData, FMemoryReader& MemoryStream) const override;
344 virtual void ByteSwapOut(ICompressedAnimData& AnimData, TArrayView<uint8> CompressedData, FMemoryWriter& MemoryStream) const override;
345
346 virtual void DecompressPose(FAnimSequenceDecompressionContext& DecompContext, const BoneTrackArray& RotationPairs, const BoneTrackArray& TranslationPairs, const BoneTrackArray& ScalePairs, TArrayView<FTransform>& OutAtoms) const override;
347 virtual void DecompressBone(FAnimSequenceDecompressionContext& DecompContext, int32 TrackIndex, FTransform& OutAtom) const override;
348
349protected:
350#if WITH_EDITOR
357 virtual bool DoReduction(const FCompressibleAnimData& CompressibleAnimData, FCompressibleAnimDataResult& OutResult) PURE_VIRTUAL(UAnimCompress::DoReduction,return false;);
358#endif // WITH_EDITOR
359
368 float MaxPosDelta);
369
377 struct FTranslationTrack& Track,
378 float MaxPosDelta);
379
388 float MaxRotDelta);
389
397 struct FRotationTrack& Track,
398 float MaxRotDelta);
399
408 float MaxScaleDelta);
409
417 struct FScaleTrack& Track,
418 float MaxScaleDelta);
419
420
431 static void FilterTrivialKeys(
435 float MaxPosDelta,
436 float MaxRotDelta,
437 float MaxScaleDelta);
438
449 int32 StartIndex,
450 int32 Interval);
451
461 struct FTranslationTrack& Track,
462 int32 StartIndex,
463 int32 Interval);
464
475 int32 StartIndex,
476 int32 Interval);
477
487 struct FRotationTrack& Track,
488 int32 StartIndex,
489 int32 Interval);
490
503 int32 StartIndex,
504 int32 Interval);
505
518 float SequenceLength,
522
530
531public:
532
554 bool IncludeKeyTable = false);
555
556#if WITH_EDITOR
557 UE_DEPRECATED(5.1, "PopulateDDCKeyArchive has been deprecated")
559
560protected:
561 virtual void PopulateDDCKey(const UE::Anim::Compression::FAnimDDCKeyArgs& KeyArgs, FArchive& Ar) override;
562#endif // WITH_EDITOR
563
571 static void UnalignedWriteToStream(TArray<uint8>& ByteStream, const void* Src, SIZE_T Len);
572
581 static void UnalignedWriteToStream(TArray<uint8>& ByteStream, int32& StreamOffset, const void* Src, SIZE_T Len);
582
593 TArray<uint8>& ByteStream,
595 const FVector3f& Vec,
596 const float* Mins,
597 const float* Ranges);
598
609 TArray<uint8>& ByteStream,
611 const FQuat4f& Quat,
612 const float* Mins,
613 const float* Ranges);
614
622 static void PadByteStream(TArray<uint8>& ByteStream, const int32 Alignment, uint8 Sentinel);
623
627 static constexpr uint8 AnimationPadSentinel = 85; //(1<<1)+(1<<3)+(1<<5)+(1<<7)
628};
629
630
631
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
uint8 MakeBitForFlag(uint32 Item, uint32 Position)
void DecompressPose(FCompactPose &OutPose, const FCompressedAnimSequence &CompressedData, const FAnimExtractContext &ExtractionContext, USkeleton *SourceSkeleton, float SequenceLength, EAnimInterpolationType Interpolation, bool bIsBakedAdditive, FName RetargetSource, FName SourceName, const FRootMotionReset &RootMotionReset)
Definition AnimCompressionTypes.cpp:1648
AnimationCompressionFormat
Definition AnimEnums.h:70
#define check(expr)
Definition AssertionMacros.h:314
#define PURE_VIRTUAL(func,...)
Definition CoreMiscDefines.h:103
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#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::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
#define NSLOCTEXT(InNamespace, InKey, InTextLiteral)
Definition Internationalization.h:300
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition AnimationUtils.h:54
Definition Archive.h:1208
Definition AnimCompress.h:191
ENGINE_API ~FCompressionMemorySummary()
Definition AnimCompress.cpp:79
ENGINE_API void GatherPostCompressionStats(const FCompressedAnimSequence &CompressedData, const TArray< FBoneData > &BoneData, const FName AnimFName, double CompressionTime, bool bInPerformedCompression)
Definition AnimCompress.cpp:40
ENGINE_API void GatherPreCompressionStats(int32 RawSize, int32 PreviousCompressionSize)
Definition MemoryReader.h:17
Definition MemoryWriter.h:101
Definition NameTypes.h:617
Definition Text.h:385
static CORE_API FText FromName(const FName &Val)
Definition Text.cpp:1076
static CORE_API FText AsNumber(float Val, const FNumberFormattingOptions *const Options=NULL, const FCulturePtr &TargetCulture=NULL)
static CORE_API FText Format(FTextFormat Fmt, const FFormatNamedArguments &InArguments)
Definition Text.cpp:469
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition EnumAsByte.h:22
UE_FORCEINLINE_HINT ValueType & Add(const KeyType &InKey, const ValueType &InValue)
Definition SortedMap.h:194
Definition UniquePtr.h:107
Definition AnimBoneCompressionCodec.h:27
Definition AnimCompress.h:316
static void UnalignedWriteToStream(TArray< uint8 > &ByteStream, const void *Src, SIZE_T Len)
static void PadByteStream(TArray< uint8 > &ByteStream, const int32 Alignment, uint8 Sentinel)
static void PrecalculateShortestQuaternionRoutes(TArray< struct FRotationTrack > &RotationData)
static void FilterTrivialScaleKeys(struct FScaleTrack &Track, float MaxScaleDelta)
static void FilterTrivialScaleKeys(TArray< struct FScaleTrack > &Track, float MaxScaleDelta)
static void FilterTrivialPositionKeys(TArray< struct FTranslationTrack > &Track, float MaxPosDelta)
static void FilterTrivialRotationKeys(TArray< struct FRotationTrack > &InputTracks, float MaxRotDelta)
static void FilterTrivialKeys(TArray< struct FTranslationTrack > &PositionTracks, TArray< struct FRotationTrack > &RotationTracks, TArray< struct FScaleTrack > &ScaleTracks, float MaxPosDelta, float MaxRotDelta, float MaxScaleDelta)
static void FilterIntermittentPositionKeys(TArray< struct FTranslationTrack > &PositionTracks, int32 StartIndex, int32 Interval)
static void FilterTrivialPositionKeys(struct FTranslationTrack &Track, float MaxPosDelta)
static void BitwiseCompressAnimationTracks(const FCompressibleAnimData &CompressibleAnimData, FCompressibleAnimDataResult &OutCompressedData, AnimationCompressionFormat TargetTranslationFormat, AnimationCompressionFormat TargetRotationFormat, AnimationCompressionFormat TargetScaleFormat, const TArray< FTranslationTrack > &TranslationData, const TArray< FRotationTrack > &RotationData, const TArray< FScaleTrack > &ScaleData, bool IncludeKeyTable=false)
static void FilterIntermittentPositionKeys(struct FTranslationTrack &Track, int32 StartIndex, int32 Interval)
static void FilterTrivialRotationKeys(struct FRotationTrack &Track, float MaxRotDelta)
static void PackQuaternionToStream(TArray< uint8 > &ByteStream, AnimationCompressionFormat Format, const FQuat4f &Quat, const float *Mins, const float *Ranges)
static void SeparateRawDataIntoTracks(const TArray< struct FRawAnimSequenceTrack > &RawAnimData, float SequenceLength, TArray< struct FTranslationTrack > &OutTranslationData, TArray< struct FRotationTrack > &OutRotationData, TArray< struct FScaleTrack > &OutScaleData)
static void UnalignedWriteToStream(TArray< uint8 > &ByteStream, int32 &StreamOffset, const void *Src, SIZE_T Len)
static void FilterIntermittentRotationKeys(TArray< struct FRotationTrack > &RotationTracks, int32 StartIndex, int32 Interval)
static void PackVectorToStream(TArray< uint8 > &ByteStream, AnimationCompressionFormat Format, const FVector3f &Vec, const float *Mins, const float *Ranges)
static void FilterIntermittentKeys(TArray< struct FTranslationTrack > &PositionTracks, TArray< struct FRotationTrack > &RotationTracks, int32 StartIndex, int32 Interval)
static void FilterIntermittentRotationKeys(struct FRotationTrack &Track, int32 StartIndex, int32 Interval)
Definition AnimSequence.h:203
UE_REWRITE void Sort(RangeType &&Range)
Definition Sort.h:16
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition AnimCompress.h:231
bool bOutput
Definition AnimCompress.h:241
FAnimCompressContext(bool bInOutput, uint32 InMaxAnimations=1)
Definition AnimCompress.h:243
uint32 AnimIndex
Definition AnimCompress.h:239
FAnimCompressContext(const FAnimCompressContext &Rhs)
Definition AnimCompress.h:251
FAnimCompressContext & operator=(const FAnimCompressContext &)=default
friend class FDerivedDataAnimationCompression
Definition AnimCompress.h:262
uint32 MaxAnimations
Definition AnimCompress.h:240
Definition AnimSequenceDecompressionContext.h:14
Definition AnimCompressionTypes.h:775
Definition AnimCompressionTypes.h:462
Definition AnimCompress.h:150
FErrorTrackerWorstAnimation()
Definition AnimCompress.h:151
FText ToText() const
Definition AnimCompress.h:168
bool operator<(const FErrorTrackerWorstAnimation &Rhs) const
Definition AnimCompress.h:161
float GetErrorValue() const
Definition AnimCompress.h:166
FErrorTrackerWorstAnimation(float InAvgError, FName InMaxErrorAnimName)
Definition AnimCompress.h:156
Definition AnimCompress.h:93
float GetErrorValue() const
Definition AnimCompress.h:115
float BoneError
Definition AnimCompress.h:134
int32 BoneErrorBone
Definition AnimCompress.h:140
FName BoneErrorBoneName
Definition AnimCompress.h:143
FName BoneErrorAnimName
Definition AnimCompress.h:146
FErrorTrackerWorstBone(float InBoneError, float InBoneErrorTime, int32 InBoneErrorBone, FName InBoneErrorBoneName, FName InBoneErrorAnimName)
Definition AnimCompress.h:102
FText ToText() const
Definition AnimCompress.h:117
FErrorTrackerWorstBone()
Definition AnimCompress.h:94
bool operator<(const FErrorTrackerWorstBone &Rhs) const
Definition AnimCompress.h:110
float BoneErrorTime
Definition AnimCompress.h:137
Definition AnimCompress.h:30
void LogErrorStat()
Definition AnimCompress.h:66
void StoreErrorStat(SortType NewError, ArgsType &&... Args)
Definition AnimCompress.h:44
bool IsValid() const
Definition AnimCompress.h:79
const DataType & GetMaxErrorItem() const
Definition AnimCompress.h:74
bool CanUseErrorStat(SortType NewError)
Definition AnimCompress.h:38
FMaxErrorStatTracker()
Definition AnimCompress.h:32
Definition Text.h:199
int32 MinimumIntegralDigits
Definition Text.h:214
int32 MinimumFractionalDigits
Definition Text.h:220
Definition AnimSequence.h:106
Definition AnimSequence.h:121
Definition AnimSequence.h:91
Definition AnimCompressionTypes.h:431
Definition Greater.h:19