UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimEncoding_VariableKeyLerp.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 AnimEncoding_VariableKeyLerp.h: Variable key compression.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "AnimEncoding.h"
13
14class FMemoryWriter;
15
20{
21public:
30 virtual void ByteSwapRotationIn(
31 FUECompressedAnimData& CompressedData,
32 FMemoryReader& MemoryReader,
34 int32 NumKeysRot) override;
35
44 virtual void ByteSwapTranslationIn(
45 FUECompressedAnimData& CompressedData,
46 FMemoryReader& MemoryReader,
48 int32 NumKeysTransn) override;
49
58 virtual void ByteSwapScaleIn(
59 FUECompressedAnimData& CompressedData,
60 FMemoryReader& MemoryReader,
62 int32 NumKeysScale) override;
63
72 virtual void ByteSwapRotationOut(
73 FUECompressedAnimData& CompressedData,
74 FMemoryWriter& MemoryWriter,
76 int32 NumKeysRot) override;
77
86 virtual void ByteSwapTranslationOut(
87 FUECompressedAnimData& CompressedData,
88 FMemoryWriter& MemoryWriter,
90 int32 NumKeysTrans) override;
91
100 virtual void ByteSwapScaleOut(
101 FUECompressedAnimData& CompressedData,
102 FMemoryWriter& MemoryWriter,
104 int32 NumKeysScale) override;
105};
106
107template<int32 FORMAT>
109{
110public:
119
128
137
138#if USE_ANIMATION_CODEC_BATCH_SOLVER
139
147 virtual void GetPoseRotations(
151
163
171 virtual void GetPoseScales(
175#endif
176
177};
178
179
187template<int32 FORMAT>
189{
190 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
191
192 const int32* RESTRICT TrackData = AnimData.CompressedTrackOffsets.GetData() + (TrackIndex * 4);
195 const uint8* RESTRICT RotStream = AnimData.CompressedByteStream.GetData() + RotKeysOffset;
196
197 if (NumRotKeys == 1)
198 {
199 // For a rotation track of n=1 keys, the single key is packed as an FQuatFloat96NoW.
200 FQuat4f R0;
202 OutAtom.SetRotation(FQuat(R0));
203 }
204 else
205 {
206 const int32 RotationStreamOffset = (FORMAT == ACF_IntervalFixed32NoW) ? (sizeof(float)*6) : 0; // offset past Min and Range data
209
211 int32 Index1;
212 float Alpha = TimeToIndex(DecompContext.Interpolation, AnimData.CompressedNumberOfKeys, FrameTable, DecompContext.GetRelativePosition(), NumRotKeys, Index0, Index1);
213
214
215 if (Index0 != Index1)
216 {
217 // unpack and lerp between the two nearest keys
220 FQuat4f R0;
221 FQuat4f R1;
224
225 // Fast linear quaternion interpolation.
227 RLerped.Normalize();
228 OutAtom.SetRotation(FQuat(RLerped));
229 }
230 else // (Index0 == Index1)
231 {
232 // unpack a single key
234
235 FQuat4f R0;
237
238 OutAtom.SetRotation(FQuat(R0));
239 }
240 }
241
242}
243
251template<int32 FORMAT>
253{
254 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
255
256 const int32* RESTRICT TrackData = AnimData.CompressedTrackOffsets.GetData() + (TrackIndex * 4);
259 const uint8* RESTRICT TransStream = AnimData.CompressedByteStream.GetData() + TransKeysOffset;
260
261 const int32 TransStreamOffset = ((FORMAT == ACF_IntervalFixed32NoW) && NumTransKeys > 1) ? (sizeof(float) * 6) : 0; // offset past Min and Range data
264
266 int32 Index1;
267 float Alpha = TimeToIndex(DecompContext.Interpolation, AnimData.CompressedNumberOfKeys, FrameTable, DecompContext.GetRelativePosition(), NumTransKeys, Index0, Index1);
268
269 if (Index0 != Index1)
270 {
271 FVector3f P0;
272 FVector3f P1;
277 OutAtom.SetTranslation( (FVector)FMath::Lerp( P0, P1, Alpha ) );
278 }
279 else // (Index0 == Index1)
280 {
281 // unpack a single key
282 FVector3f P0;
285 OutAtom.SetTranslation( (FVector)P0 );
286 }
287}
288
296template<int32 FORMAT>
298{
299 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
300
301 const int32 ScaleKeysOffset = AnimData.CompressedScaleOffsets.GetOffsetData(TrackIndex, 0);
302 const int32 NumScaleKeys = AnimData.CompressedScaleOffsets.GetOffsetData(TrackIndex, 1);
303 const uint8* RESTRICT ScaleStream = AnimData.CompressedByteStream.GetData() + ScaleKeysOffset;
304
305 const int32 ScaleStreamOffset = ((FORMAT == ACF_IntervalFixed32NoW) && NumScaleKeys > 1) ? (sizeof(float) * 6) : 0; // offset past Min and Range data
308
310 int32 Index1;
311 float Alpha = TimeToIndex(DecompContext.Interpolation, AnimData.CompressedNumberOfKeys, FrameTable, DecompContext.GetRelativePosition(), NumScaleKeys, Index0, Index1);
312
313 if (Index0 != Index1)
314 {
315 FVector3f P0;
316 FVector3f P1;
321 OutAtom.SetScale3D( (FVector)FMath::Lerp( P0, P1, Alpha ) );
322 }
323 else // (Index0 == Index1)
324 {
325 // unpack a single key
326 FVector3f P0;
329 OutAtom.SetScale3D( (FVector)P0 );
330 }
331}
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
const int32 CompressedTranslationStrides[ACF_MAX]
Definition AnimEncoding.cpp:14
const int32 CompressedScaleNum[ACF_MAX]
Definition AnimEncoding.cpp:89
const int32 CompressedRotationNum[ACF_MAX]
Definition AnimEncoding.cpp:50
const int32 CompressedTranslationNum[ACF_MAX]
Definition AnimEncoding.cpp:26
const int32 CompressedScaleStrides[ACF_MAX]
Definition AnimEncoding.cpp:77
const int32 CompressedRotationStrides[ACF_MAX]
Definition AnimEncoding.cpp:38
@ ACF_IntervalFixed32NoW
Definition AnimEnums.h:74
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RESTRICT
Definition Platform.h:706
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::Math::TQuat< double > FQuat
Definition MathFwd.h:50
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition AnimEncoding_ConstantKeyLerp.h:19
Definition AnimEncoding_VariableKeyLerp.h:20
virtual void ByteSwapTranslationOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&TransTrackData, int32 NumKeysTrans) override
Definition AnimEncoding_VariableKeyLerp.cpp:164
virtual void ByteSwapScaleIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&ScaleTrackData, int32 NumKeysScale) override
Definition AnimEncoding_VariableKeyLerp.cpp:101
virtual void ByteSwapTranslationIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&TransTrackData, int32 NumKeysTransn) override
Definition AnimEncoding_VariableKeyLerp.cpp:69
virtual void ByteSwapScaleOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&ScaleTrackData, int32 NumKeysScale) override
Definition AnimEncoding_VariableKeyLerp.cpp:197
virtual void ByteSwapRotationOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&RotTrackData, int32 NumKeysRot) override
Definition AnimEncoding_VariableKeyLerp.cpp:132
virtual void ByteSwapRotationIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&RotTrackData, int32 NumKeysRot) override
Definition AnimEncoding_VariableKeyLerp.cpp:37
Definition AnimEncoding_VariableKeyLerp.h:109
virtual void GetBoneAtomTranslation(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_VariableKeyLerp.h:252
virtual void GetPoseScales(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext) override
virtual void GetBoneAtomRotation(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_VariableKeyLerp.h:188
virtual void GetPoseTranslations(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext) override
virtual void GetPoseRotations(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext) override
virtual void GetBoneAtomScale(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_VariableKeyLerp.h:297
Definition MemoryReader.h:17
Definition MemoryWriter.h:101
Definition ArrayView.h:139
Definition AnimSequenceDecompressionContext.h:14
ContainerTypeMakerTemplate< uint8 >::Type CompressedByteStream
Definition AnimCompressionTypes.h:382
ContainerTypeMakerTemplate< int32 >::Type CompressedTrackOffsets
Definition AnimCompressionTypes.h:368
FCompressedOffsetDataBase< typename ContainerTypeMakerTemplate< int32 >::Type > CompressedScaleOffsets
Definition AnimCompressionTypes.h:380
const int32 GetOffsetData(int32 StripIndex, int32 Offset) const
Definition AnimCompressionTypes.h:73
static constexpr UE_FORCEINLINE_HINT T Lerp(const T &A, const T &B, const U &Alpha)
Definition UnrealMathUtility.h:1116
Definition AnimCompressionTypes.h:505
int32 CompressedNumberOfKeys
Definition AnimCompressionTypes.h:433
static TQuat< float > FastLerp(const TQuat< float > &A, const TQuat< float > &B, const float Alpha)
Definition Quat.h:1373