/** * Baseclass for animation compression algorithms. * * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved. */ class AnimationCompressionAlgorithm extends Object abstract native(Anim) DependsOn(AnimSequence) hidecategories(Object); /** A human-readable name for this modifier; appears in editor UI. */ var string Description; /** Compression algorithms requiring a skeleton should set this value to TRUE. */ var bool bNeedsSkeleton; /** Format for bitwise compression of translation data. */ var AnimationCompressionFormat TranslationCompressionFormat; /** Format for bitwise compression of rotation data. */ var() AnimationCompressionFormat RotationCompressionFormat; cpptext { public: /** * Reduce the number of keyframes and bitwise compress the specified sequence. * * @param AnimSeq The animation sequence to compress. * @param SkelMesh The skeletal mesh against which to compress the animation. Not needed by all compression schemes. * @param bOutput If FALSE don't generate output or compute memory savings. * @return FALSE if a skeleton was needed by the algorithm but not provided. */ UBOOL Reduce(class UAnimSequence* AnimSeq, class USkeletalMesh* SkelMesh, UBOOL bOutput); /** * Reduce the number of keyframes and bitwise compress all sequences in the specified animation set. * * @param AnimSet The animation set to compress. * @param SkelMesh The skeletal mesh against which to compress the animation. Not needed by all compression schemes. * @param bOutput If FALSE don't generate output or compute memory savings. * @return FALSE if a skeleton was needed by the algorithm but not provided. */ UBOOL Reduce(class UAnimSet* AnimSet, class USkeletalMesh* SkelMesh, UBOOL bOutput); protected: /** * Implemented by child classes, this function reduces the number of keyframes in * the specified sequence, given the specified skeleton (if needed). * * @return TRUE if the keyframe reduction was successful. */ virtual void DoReduction(class UAnimSequence* AnimSeq, class USkeletalMesh* SkelMesh, const TArray& BoneData) PURE_VIRTUAL(UAnimationCompressionAlgorithm::DoReduction,); /** * Common compression utility to remove 'redundant' position keys in a set of tracks based on the provided delta threshold * * @param InputTracks Array of position track elements to reduce * @param MaxPosDelta Maximum local-space threshold for stationary motion */ static void FilterTrivialPositionKeys( TArray& Track, FLOAT MaxPosDelta); /** * Common compression utility to remove 'redundant' position keys in a single track based on the provided delta threshold * * @param Track Track to reduce * @param MaxPosDelta Maximum local-space threshold for stationary motion */ static void FilterTrivialPositionKeys( struct FTranslationTrack& Track, FLOAT MaxPosDelta); /** * Common compression utility to remove 'redundant' rotation keys in a set of tracks based on the provided delta threshold * * @param InputTracks Array of rotation track elements to reduce * @param MaxRotDelta Maximum angle threshold to consider stationary motion */ static void FilterTrivialRotationKeys( TArray& InputTracks, FLOAT MaxRotDelta); /** * Common compression utility to remove 'redundant' rotation keys in a set of tracks based on the provided delta threshold * * @param Track Track to reduce * @param MaxRotDelta Maximum angle threshold to consider stationary motion */ static void FilterTrivialRotationKeys( struct FRotationTrack& Track, FLOAT MaxRotDelta); /** * Common compression utility to remove 'redundant' keys based on the provided delta thresholds * * @param PositionTracks Array of position track elements to reduce * @param RotationTracks Array of rotation track elements to reduce * @param MaxPosDelta Maximum local-space threshold for stationary motion * @param MaxRotDelta Maximum angle threshold to consider stationary motion */ static void FilterTrivialKeys( TArray& PositionTracks, TArray& RotationTracks, FLOAT MaxPosDelta, FLOAT MaxRotDelta); /** * Remove translation keys from tracks marked bAnimRotationOnly. * * @param PositionTracks Array of position track elements to reduce * @param AnimSeq AnimSequence the track is from. * @param SkelMesh SkeletalMesh associated with the AnimSerquence */ static void FilterAnimRotationOnlyKeys(TArray& PositionTracks, UAnimSequence* AnimSeq, USkeletalMesh* SkelMesh); /** * Common compression utility to retain only intermittent position keys. For example, * calling with an Interval of 3 would keep every third key in the set and discard the rest * * @param PositionTracks Array of position track elements to reduce * @param StartIndex Index at which to begin reduction * @param Interval Interval of keys to retain */ static void FilterIntermittentPositionKeys( TArray& PositionTracks, INT StartIndex, INT Interval); /** * Common compression utility to retain only intermittent position keys. For example, * calling with an Interval of 3 would keep every third key in the set and discard the rest * * @param Track Track to reduce * @param StartIndex Index at which to begin reduction * @param Interval Interval of keys to retain */ static void FilterIntermittentPositionKeys( struct FTranslationTrack& Track, INT StartIndex, INT Interval); /** * Common compression utility to retain only intermittent rotation keys. For example, * calling with an Interval of 3 would keep every third key in the set and discard the rest * * @param RotationTracks Array of rotation track elements to reduce * @param StartIndex Index at which to begin reduction * @param Interval Interval of keys to retain */ static void FilterIntermittentRotationKeys( TArray& RotationTracks, INT StartIndex, INT Interval); /** * Common compression utility to retain only intermittent rotation keys. For example, * calling with an Interval of 3 would keep every third key in the set and discard the rest * * @param Track Track to reduce * @param StartIndex Index at which to begin reduction * @param Interval Interval of keys to retain */ static void FilterIntermittentRotationKeys( struct FRotationTrack& Track, INT StartIndex, INT Interval); /** * Common compression utility to retain only intermittent animation keys. For example, * calling with an Interval of 3 would keep every third key in the set and discard the rest * * @param PositionTracks Array of position track elements to reduce * @param RotationTracks Array of rotation track elements to reduce * @param StartIndex Index at which to begin reduction * @param Interval Interval of keys to retain */ static void FilterIntermittentKeys( TArray& PositionTracks, TArray& RotationTracks, INT StartIndex, INT Interval); /** * Common compression utility to populate individual rotation and translation track * arrays from a set of raw animation tracks. Used as a precurser to animation compression. * * @param RawAnimData Array of raw animation tracks * @param SequenceLength The duration of the animation in seconds * @param OutTranslationData Translation tracks to fill * @param OutRotationData Rotation tracks to fill */ static void SeparateRawDataIntoTracks( const TArray& RawAnimData, FLOAT SequenceLength, TArray& OutTranslationData, TArray& OutRotationData); /** * Common compression utility to walk an array of rotation tracks and enforce * that all adjacent rotation keys are represented by shortest-arc quaternion pairs. * * @param RotationData Array of rotation track elements to reduce. */ static void PrecalculateShortestQuaternionRoutes(TArray& RotationData); public: /** * Encodes individual key arrays into an AnimSequence using the desired bit packing formats. * * @param Seq Pointer to an Animation Sequence which will contain the bit-packed data . * @param TargetTranslationFormat The format to use when encoding translation keys. * @param TargetRotationFormat The format to use when encoding rotation keys. * @param TranslationData Translation Tracks to bit-pack into the Animation Sequence. * @param RotationData Rotation Tracks to bit-pack into the Animation Sequence. * @param IncludeKeyTable TRUE if the compressed data should also contain a table of frame indices for each key. (required by some codecs) */ static void BitwiseCompressAnimationTracks( class UAnimSequence* Seq, AnimationCompressionFormat TargetTranslationFormat, AnimationCompressionFormat TargetRotationFormat, const TArray& TranslationData, const TArray& RotationData, UBOOL IncludeKeyTable = FALSE); } defaultproperties { Description="None" TranslationCompressionFormat=ACF_None RotationCompressionFormat=ACF_Float96NoW }