UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnimEncoding_ConstantKeyLerp.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 AnimEncoding_ConstantKeyLerp.h: Constant key compression.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "AnimEncoding.h"
12
13class FMemoryWriter;
14
19{
20public:
29 virtual void ByteSwapRotationIn(
30 FUECompressedAnimData& CompressedData,
31 FMemoryReader& MemoryReader,
33 int32 NumKeysRot) override;
34
43 virtual void ByteSwapTranslationIn(
44 FUECompressedAnimData& CompressedData,
45 FMemoryReader& MemoryReader,
47 int32 NumKeysTrans) override;
48
57 virtual void ByteSwapScaleIn(
58 FUECompressedAnimData& CompressedData,
59 FMemoryReader& MemoryReader,
61 int32 NumKeysScale) override;
62
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>
178
179
180
188template<int32 FORMAT>
190{
191 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
192
193 const int32* RESTRICT TrackData = AnimData.CompressedTrackOffsets.GetData() + (TrackIndex * 4);
196 const uint8* RESTRICT RotStream = AnimData.CompressedByteStream.GetData() + RotKeysOffset;
197
198 if (NumRotKeys == 1)
199 {
200 // For a rotation track of n=1 keys, the single key is packed as an FQuatFloat96NoW.
201 FQuat4f R0;
203 OutAtom.SetRotation( FQuat(R0) );
204 }
205 else
206 {
208 int32 Index1;
209 float Alpha = TimeToIndex(DecompContext.GetPlayableLength(), DecompContext.GetRelativePosition(), NumRotKeys, DecompContext.Interpolation, Index0, Index1);
210
211 const int32 RotationStreamOffset = (FORMAT == ACF_IntervalFixed32NoW) ? (sizeof(float)*6) : 0; // offset past Min and Range data
212
213 if (Index0 != Index1)
214 {
215
216 // unpack and lerp between the two nearest keys
219 FQuat4f R0;
220 FQuat4f R1;
223
224 // Fast linear quaternion interpolation.
226 BlendedQuat.Normalize();
227 OutAtom.SetRotation( FQuat(BlendedQuat) );
228 }
229 else // (Index0 == Index1)
230 {
231
232 // unpack a single key
234 FQuat4f R0;
236 OutAtom.SetRotation( FQuat(R0) );
237 }
238 }
239}
240
248template<int32 FORMAT>
250{
251 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
252
253 const int32* RESTRICT TrackData = AnimData.CompressedTrackOffsets.GetData() + (TrackIndex * 4);
256 const uint8* RESTRICT TransStream = AnimData.CompressedByteStream.GetData() + TransKeysOffset;
257
259 int32 Index1;
260 float Alpha = TimeToIndex(DecompContext.GetPlayableLength(), DecompContext.GetRelativePosition(), NumTransKeys, DecompContext.Interpolation, Index0, Index1);
261
262 const int32 TransStreamOffset = ((FORMAT == ACF_IntervalFixed32NoW) && NumTransKeys > 1) ? (sizeof(float)*6) : 0; // offset past Min and Range data
263
264 if (Index0 != Index1)
265 {
268 FVector3f P0;
269 FVector3f P1;
272 OutAtom.SetTranslation( (FVector)FMath::Lerp( P0, P1, Alpha ) );
273 }
274 else // (Index0 == Index1)
275 {
276 // unpack a single key
278 FVector3f P0;
280 OutAtom.SetTranslation((FVector)P0);
281 }
282}
283
291template<int32 FORMAT>
293{
294 const FUECompressedAnimData& AnimData = static_cast<const FUECompressedAnimData&>(DecompContext.CompressedAnimData);
295
296 const int32 ScaleKeysOffset = AnimData.CompressedScaleOffsets.GetOffsetData(TrackIndex, 0);
297 const int32 NumScaleKeys = AnimData.CompressedScaleOffsets.GetOffsetData(TrackIndex, 1);
298 const uint8* RESTRICT ScaleStream = AnimData.CompressedByteStream.GetData() + ScaleKeysOffset;
299
301 int32 Index1;
302 float Alpha = TimeToIndex(DecompContext.GetPlayableLength(), DecompContext.GetRelativePosition(), NumScaleKeys, DecompContext.Interpolation, Index0, Index1);
303
304 const int32 ScaleStreamOffset = ((FORMAT == ACF_IntervalFixed32NoW) && NumScaleKeys > 1) ? (sizeof(float)*6) : 0; // offset past Min and Range data
305
306 if (Index0 != Index1)
307 {
310 FVector3f P0;
311 FVector3f P1;
314 OutAtom.SetScale3D( (FVector)FMath::Lerp( P0, P1, Alpha ) );
315 }
316 else // (Index0 == Index1)
317 {
318 // unpack a single key
320 FVector3f P0;
322 OutAtom.SetScale3D((FVector)P0);
323 }
324}
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
virtual void ByteSwapScaleOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&ScaleTrackData, int32 NumKeysScale) override
Definition AnimEncoding_ConstantKeyLerp.cpp:226
virtual void ByteSwapRotationIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&RotTrackData, int32 NumKeysRot) override
Definition AnimEncoding_ConstantKeyLerp.cpp:37
virtual void ByteSwapRotationOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&RotTrackData, int32 NumKeysRot) override
Definition AnimEncoding_ConstantKeyLerp.cpp:150
virtual void ByteSwapTranslationIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&TransTrackData, int32 NumKeysTrans) override
Definition AnimEncoding_ConstantKeyLerp.cpp:75
virtual void ByteSwapScaleIn(FUECompressedAnimData &CompressedData, FMemoryReader &MemoryReader, uint8 *&ScaleTrackData, int32 NumKeysScale) override
Definition AnimEncoding_ConstantKeyLerp.cpp:113
virtual void ByteSwapTranslationOut(FUECompressedAnimData &CompressedData, FMemoryWriter &MemoryWriter, uint8 *&TransTrackData, int32 NumKeysTrans) override
Definition AnimEncoding_ConstantKeyLerp.cpp:188
Definition AnimEncoding_ConstantKeyLerp.h:109
void GetPoseRotations(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext)
virtual void GetBoneAtomRotation(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_ConstantKeyLerp.h:189
virtual void GetBoneAtomTranslation(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_ConstantKeyLerp.h:249
void GetPoseScales(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext)
virtual void GetBoneAtomScale(FTransform &OutAtom, const FAnimSequenceDecompressionContext &DecompContext, int32 TrackIndex) override
Definition AnimEncoding_ConstantKeyLerp.h:292
void GetPoseTranslations(TArrayView< FTransform > &Atoms, const BoneTrackArray &DesiredPairs, FAnimSequenceDecompressionContext &DecompContext)
Definition AnimEncoding.h:235
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
static TQuat< float > FastLerp(const TQuat< float > &A, const TQuat< float > &B, const float Alpha)
Definition Quat.h:1373