Overview | Package | Class | Source | Class tree | Glossary | UnrealScript Documentation |
previous class next class | frames no frames |
00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 00049 00050 00051 00052 00053 00054 00055 00056 00057 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00070 00071 00072 00073 00074 00075 00076 00077 00078 00079 00080 00081 00082 00083 00084 00085 00086 00087 00088 00089 00090 00091 00092 00093 00094 00095 00096 00097 00098 00099 00100 00101 00102 00103 00104 00105 00106 00107 00108 00109 00110 00111 00112 00113 00114 00115 00116 00117 00118 00119 00120 00121 00122 00123 00124 00125 00126 00127 00128 00129 00130 00131 00132 00133 00134 00135 00136 00137 00138 00139 00140 00141 00142 00143 00144 00145 00146 00147 00148 00149 00150 00151 00152 00153 00154 00155 00156 00157 00158 00159 00160 00161 00162 00163 00164 00165 00166 00167 00168 00169 00170 00171 00172 00173 00174 00175 00176 00177 00178 00179 00180 00181 00182 00183 00184 00185 00186 00187 00188 00189 00190 00191 00192 00193 00194 00195 00196 00197 00198 00199 00200 00201 00202 00203 00204 00205 00206 00207 00208 00209 00210 00211 00212 00213 00214 00215 00216 00217 00218 00219 00220 00221 00222 00223 00224 00225 00226 00227 00228 00229 00230 00231 00232 00233 00234 00235 00236 00237 00238 00239 00240 00241 00242 00243 00244 00245 00246 00247 00248 00249 00250 00251 00252 00253 00254 00255 00256 00257 00258 00259 00260 00261 00262 00263 00264 00265 00266 00267 00268 00269 00270 00271 00272 00273 00274 00275 00276 00277 00278 00279 00280 00281 00282 00283 00284 00285 00286 00287 00288 00289 00290 00291 00292 00293 00294 00295 00296 00297 00298 00299 00300 00301 00302 00303 00304 00305 00306 00307 00308 00309 00310 00311 00312 00313 00314 00315 00316 00317 00318 00319 00320 00321 00322 00323 00324 00325 00326 00327 00328 00329 00330 00331 00332 00333 00334 00335 00336 00337 00338 00339 00340 00341 00342 00343 00344 00345 00346 00347 00348 00349 00350 00351 00352 00353 00354 00355 00356 00357 00358 00359 00360 00361 00362 00363 00364 00365 00366 00367 00368 00369 00370 00371 00372 00373 00374 00375 00376 00377 00378 00379 00380 00381 00382 00383 00384 00385 00386 00387 00388 00389 00390 00391 00392 00393 00394 00395 00396 00397 00398 00399 00400 00401 00402 00403 00404 00405 00406 00407 00408 00409 00410 00411 00412 00413 00414 00415 00416 00417 00418 00419 00420 00421 00422 00423 00424 00425 00426 00427 00428 00429 00430 00431 00432 00433 00434 00435 00436 00437 00438 00439 00440 00441 00442 00443 00444 00445 00446 00447 00448 00449 00450 00451 00452 00453 00454 00455 00456 00457 00458 00459 00460 00461 00462 00463 00464 00465 00466 00467 00468 00469 00470 00471 00472 00473 00474 00475 00476 00477 00478 00479 00480 00481 00482 00483 00484 00485 00486 00487 00488 00489 00490 00491 00492 00493 00494 00495 00496 |
/** * One animation sequence of keyframes. Contains a number of tracks of data. * The Outer of AnimSequence is expected to be its AnimSet. * * Copyright 1998-2011 Epic Games, Inc. All Rights Reserved. */ class AnimSequence extends Object native(Anim) config(Engine) hidecategories(Object); /* * Triggers an animation notify. Each AnimNotifyEvent contains an AnimNotify object * which has its Notify method called and passed to the animation. */ struct native AnimNotifyEvent { var() float Time; var() instanced AnimNotify Notify; var() editoronly Name Comment; var() float Duration; }; /** * Raw keyframe data for one track. Each array will contain either NumFrames elements or 1 element. * One element is used as a simple compression scheme where if all keys are the same, they'll be * reduced to 1 key that is constant over the entire sequence. * * @warning: manually mirrored in UnMiscDeclerations.h due to mixed native/ script serialization */ struct RawAnimSequenceTrack { /** Position keys. */ var array<vector> PosKeys; /** Rotation keys. */ var array<quat> RotKeys; }; /** Name of the animation sequence. Used in AnimNodeSequence. */ var name SequenceName; /** Animation notifies, sorted by time (earliest notification first). */ var() editinline array<AnimNotifyEvent> Notifies; /** Animation Meta Data */ var() editinline instanced Array<AnimMetaData> MetaData; /* * This is to support Skel Control Strength from animation data * For example, if you'd like to scale bones via SkelControlSingleBone from animation data. * This looks up SkelControlName in the Anim tree and apply strength at the point where it's set up */ struct native TimeModifier { /** Time to apply **/ var() float Time; /** Target Strength of the Skel Control at this time **/ /** This will linearly interpolate between multiple strength within one anim data**/ var() float TargetStrength; }; /* DEPRECATED VER_ADDED_ANIM_METADATA_FIXED_QUATERROR * This contains all skel control modifiers * The TimeModifier will be sorted by time * Initially it starts from what strength it was when animation started. */ struct native SkelControlModifier { /** SkelControl Node Name in the Anim Tree that would apply **/ var() name SkelControlName; /** Modifiers for what time and what strength for this skelcontrol name**/ var() editinline array<TimeModifier> Modifiers; }; /** DEPRECATED VER_ADDED_ANIM_METADATA_FIXED_QUATERROR Bone Control Modifiers, sorted by time (earliest notification first). */ var deprecated editinline array<SkelControlModifier> BoneControlModifiers; /** Length (in seconds) of this AnimSequence if played back with a speed of 1.0. */ var float SequenceLength; /** Number of raw frames in this sequence (not used by engine - just for informational purposes). */ var int NumFrames; /** Number for tweaking playback rate of this animation globally. */ var() float RateScale; /** * if TRUE, disable interpolation between last and first frame when looping. */ var() bool bNoLoopingInterpolation; /** * Raw uncompressed keyframe data. RawAnimData is deprecated and moved to RawAnimationData * to switch to native serialization. Down the road it should be switched to use lazy loading * as the data is only used in the editor. It is used pervasively enough to be a separate change. */ var deprecated private const array<RawAnimSequenceTrack> RawAnimData; var native private const array<RawAnimSequenceTrack> RawAnimationData; /** * Keyframe position data for one track. Pos(i) occurs at Time(i). Pos.Num() always equals Time.Num(). */ struct native TranslationTrack { var array<vector> PosKeys; var array<float> Times; }; /** * Keyframe rotation data for one track. Rot(i) occurs at Time(i). Rot.Num() always equals Time.Num(). */ struct native RotationTrack { var array<quat> RotKeys; var array<float> Times; }; /** * Key frame curve data for one track * CurveName: Morph Target Name * CurveWeights: List of weights for each frame */ struct native CurveTrack { var name CurveName; var array<float> CurveWeights; structcpptext { /** Returns TRUE if valid curve weight exists in the array*/ UBOOL IsValidCurveTrack(); /** This is very simple cut to 1 key method if all is same since I see so many redundant same value in every frame * Eventually this can get more complicated * Will return TRUE if compressed to 1. Return FALSE otherwise **/ UBOOL CompressCurveWeights(); } }; /** * Translation data post keyframe reduction. TranslationData.Num() is zero if keyframe reduction * has not yet been applied. */ var transient const array<TranslationTrack> TranslationData; /** * Rotation data post keyframe reduction. RotationData.Num() is zero if keyframe reduction * has not yet been applied. */ var transient const array<RotationTrack> RotationData; /* * Curve data - no compression yet */ var const array<CurveTrack> CurveData; /** * The compression scheme that was most recently used to compress this animation. * May be NULL. */ var() editinline editconst editoronly AnimationCompressionAlgorithm CompressionScheme; /** * Indicates animation data compression format. */ enum AnimationCompressionFormat { ACF_None, ACF_Float96NoW, ACF_Fixed48NoW, ACF_IntervalFixed32NoW, ACF_Fixed32NoW, ACF_Float32NoW, ACF_Identity }; /** The compression format that was used to compress translation tracks. */ var const AnimationCompressionFormat TranslationCompressionFormat; /** The compression format that was used to compress rotation tracks. */ var const AnimationCompressionFormat RotationCompressionFormat; struct native CompressedTrack { var array<byte> ByteStream; var array<float> Times; var float Mins[3]; var float Ranges[3]; }; /** * An array of 4*NumTrack ints, arranged as follows: * [0] Trans0.Offset * [1] Trans0.NumKeys * [2] Rot0.Offset * [3] Rot0.NumKeys * [4] Trans1.Offset * . . . */ var array<int> CompressedTrackOffsets; /** * ByteStream for compressed animation data. * All keys are currently stored at evenly-spaced intervals (ie no explicit key times). * * For a translation track of n keys, data is packed as n uncompressed float[3]: * * For a rotation track of n>1 keys, the first 24 bytes are reserved for compression info * (eg Fixed32 stores float Mins[3]; float Ranges[3]), followed by n elements of the compressed type. * For a rotation track of n=1 keys, the single key is packed as an FQuatFloat96NoW. */ var native array<byte> CompressedByteStream; /** * Indicates animation data compression format. */ enum AnimationKeyFormat { AKF_ConstantKeyLerp, AKF_VariableKeyLerp, AKF_PerTrackCompression, }; var const AnimationKeyFormat KeyEncodingFormat; /** * The runtime interface to decode and byte swap the compressed animation * May be NULL. Set at runtime - does not exist in editor */ var private transient native pointer TranslationCodec; var private transient native pointer RotationCodec; // Additive Animation Support /** TRUE if this is an Additive Animation */ var const bool bIsAdditive; /** Reference pose for additive animation. Deprecated. */ var const deprecated Array<BoneAtom> AdditiveRefPose; /** Store Reference Pose animation used to create this additive one. For playback in editor only. */ var const Array<RawAnimSequenceTrack> AdditiveBasePose; /** Reference animation name */ var const editoronly Name AdditiveRefName; /** TRUE if additive animation was built with looping interpolation. */ var editoronly bool bAdditiveBuiltLooping; /** If this animation is Additive, this is the reference to the Base Pose used. For automatic rebuilding in the editor. Made into a list to handle duplicate animations. */ var editoronly Array<AnimSequence> AdditiveBasePoseAnimSeq; /** If this animation is Additive, this is the reference to the Target Pose used. For automatic rebuilding in the editor. Made into a list to handle duplicate animations. */ var editoronly Array<AnimSequence> AdditiveTargetPoseAnimSeq; /** If this animation was used, either as a Base or Target Pose, to build additive animations, they are referenced there. For automatic rebuilding in the editor. */ var editoronly Array<AnimSequence> RelatedAdditiveAnimSeqs; // Versioning Support /** The version of the global encoding package used at the time of import */ var const int EncodingPkgVersion; /** Saved version number with CompressAnimations commandlet. To help with doing it in multiple passes. */ var editoronly const int CompressCommandletVersion; /** * Do not attempt to override compression scheme when running CompressAnimations commandlet. * Some high frequency animations are too sensitive and shouldn't be changed. */ var() editoronly const bool bDoNotOverrideCompression; /** * Debug flag to trace if this anim sequence was played. */ var const transient bool bHasBeenUsed; /** * Debug score to find out animation usage */ var const transient float UseScore; /** Temporary Animation Tagging Information: until we integrate Content Tagging * This is configurable information in Engine * Tag: Name of Tag * Contains: Contains text * Priority is index of array */ struct native AnimTag { var string Tag; // This is Tag name var array<string> Contains; // This is contains strings, i.e. _cvr_ or _cover_ for Tag name Cover }; /** * Animation tag for stat system: This is temporary until we can add content tag to animation * Currently it auto tags based on "contains" - Check DefaultEngine.ini for modification */ var config editoronly array<AnimTag> AnimTags; cpptext { // UObject interface virtual void Serialize(FArchive& Ar); virtual void PreSave(); virtual void PostLoad(); virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent); virtual void BeginDestroy(); /** * Used by various commandlets to purge editor only and platform-specific data from various objects * * @param PlatformsToKeep Platforms for which to keep platform-specific data * @param bStripLargeEditorData If TRUE, data used in the editor, but large enough to bloat download sizes, will be removed */ virtual void StripData(UE3::EPlatformType PlatformsToKeep, UBOOL bStripLargeEditorData); // AnimSequence interface /** * Reconstructs a bone atom from key-reduced tracks. */ static void ReconstructBoneAtom(FBoneAtom& OutAtom, const FTranslationTrack& TranslationTrack, const FRotationTrack& RotationTrack, FLOAT SequenceLength, FLOAT Time, UBOOL bLooping); /** * Reconstructs a bone atom from compressed tracks. */ static void ReconstructBoneAtom(FBoneAtom& OutAtom, const FCompressedTrack& TranslationTrack, const FCompressedTrack& RotationTrack, AnimationCompressionFormat TranslationCompressionFormat, AnimationCompressionFormat RotationCompressionFormat, FLOAT SequenceLength, FLOAT Time, UBOOL bLooping); /** * Reconstructs a bone atom from compressed tracks. */ static void ReconstructBoneAtom(FBoneAtom& OutAtom, const BYTE* TransStream, INT NumTransKeys, const BYTE* RotStream, INT NumRotKeys, AnimationCompressionFormat TranslationCompressionFormat, AnimationCompressionFormat RotationCompressionFormat, FLOAT SequenceLength, FLOAT Time, UBOOL bLooping); /** * Decompresses a translation key from the specified compressed translation track. */ static void ReconstructTranslation(class FVector& Out, const BYTE* Stream, INT KeyIndex, AnimationCompressionFormat TranslationCompressionFormat); /** * Decompresses a rotation key from the specified compressed rotation track. */ static void ReconstructRotation(class FQuat& Out, const BYTE* Stream, INT KeyIndex, AnimationCompressionFormat RotationCompressionFormat, const FLOAT *Mins, const FLOAT *Ranges); /** * Decompresses a translation key from the specified compressed translation track. */ static void ReconstructTranslation(class FVector& Out, const BYTE* Stream, INT KeyIndex); /** * Decompresses a rotation key from the specified compressed rotation track. */ static void ReconstructRotation(class FQuat& Out, const BYTE* Stream, INT KeyIndex, UBOOL bTrackHasCompressionInfo, AnimationCompressionFormat RotationCompressionFormat); /** * Populates the key reduced arrays from raw animation data. */ static void SeparateRawDataToTracks(const TArray<FRawAnimSequenceTrack>& RawAnimData, FLOAT SequenceLength, TArray<FTranslationTrack>& OutTranslationData, TArray<FRotationTrack>& OutRotationData); /** * Interpolate keyframes in this sequence to find the bone transform (relative to parent). * * @param OutAtom [out] Output bone transform. * @param TrackIndex Index of track to interpolate. * @param Time Time on track to interpolate to. * @param bLooping TRUE if the animation is looping. * @param bUseRawData If TRUE, use raw animation data instead of compressed data. * @param CurveKeys List of Curve Keys if exists */ void GetBoneAtom(FBoneAtom& OutAtom, INT TrackIndex, FLOAT Time, UBOOL bLooping, UBOOL bUseRawData, FCurveKeyArray* CurveKeys = NULL) const; /** * Interpolate keyframes in this sequence to find the bone transform (relative to parent). * This returns the base pose used to create the additive animation. * * @param OutAtom [out] Output bone transform. * @param TrackIndex Index of track to interpolate. * @param Time Time on track to interpolate to. * @param bLooping TRUE if the animation is looping. */ void GetAdditiveBasePoseBoneAtom(FBoneAtom& OutAtom, INT TrackIndex, FLOAT Time, UBOOL bLooping) const; /** * Interpolate curve weights of the Time in this sequence if curve data exists * * @param Time Time on track to interpolate to. * @param bLooping TRUE if the animation is looping. * @param CurveKeys Add the curve keys if exists */ void GetCurveData(FLOAT Time, UBOOL bLooping, FCurveKeyArray& CurveKeys) const; /** Sort the Notifies array by time, earliest first. */ void SortNotifies(); /** * @return A reference to the AnimSet this sequence belongs to. */ UAnimSet* GetAnimSet() const; /** * Returns the size of the object/ resource for display to artists/ LDs in the Editor. * * @return size of resource as to be displayed to artists/ LDs in the Editor. */ virtual INT GetResourceSize(); /** * @return The approximate size of raw animation data. */ INT GetApproxRawSize() const; /** * @return The approximate size of key-reduced animation data. */ INT GetApproxReducedSize() const; /** * @return The approximate size of compressed animation data. */ INT GetApproxCompressedSize() const; /** * Crops the raw anim data either from Start to CurrentTime or CurrentTime to End depending on * value of bFromStart. Can't be called against cooked data. * * @param CurrentTime marker for cropping (either beginning or end) * @param bFromStart whether marker is begin or end marker * @return TRUE if the operation was successful. */ UBOOL CropRawAnimData( FLOAT CurrentTime, UBOOL bFromStart ); /** * Utility function for lossless compression of a FRawAnimSequenceTrack * @return TRUE if keys were removed. **/ UBOOL CompressRawAnimSequenceTrack(FRawAnimSequenceTrack& RawTrack, float MaxPosDiff, float MaxAngleDiff); /** * Removes trivial frames -- frames of tracks when position or orientation is constant * over the entire animation -- from the raw animation data. If both position and rotation * go down to a single frame, the time is stripped out as well. * @return TRUE if keys were removed. */ UBOOL CompressRawAnimData(float MaxPosDiff, float MaxAngleDiff); /** * Removes trivial frames -- frames of tracks when position or orientation is constant * over the entire animation -- from the raw animation data. If both position and rotation * go down to a single frame, the time is stripped out as well. * @return TRUE if keys were removed. */ UBOOL CompressRawAnimData(); /** Clears any data in the AnimSequence, so it can be recycled when importing a new animation with same name over it. */ void RecycleAnimSequence(); /** * Clear references to additive animations. * This is the following arrays: AdditiveBasePoseAnimSeq, AdditiveTargetPoseAnimSeq and RelatedAdditiveAnimSeqs. * Handles dependencies, and removes us properly. */ void ClearAdditiveAnimReferences(); static UBOOL CopyAnimSequenceProperties(UAnimSequence* SourceAnimSeq, UAnimSequence* DestAnimSeq, UBOOL bSkipCopyingNotifies=FALSE); static void CopyMetadata(UAnimSequence* SourceAnimSeq, UAnimSequence* DestAnimSeq); static UBOOL CopyNotifies(UAnimSequence* SourceAnimSeq, UAnimSequence* DestAnimSeq); } /** * Get the time (in seconds) from the start of the animation that the first notify of the given class would fire * * @param NotifyClass Class of AnimNotify we are looking for (ie AnimNotify_Sound) * @param PlayRate Rate that animation would be played at * @param StartPosition Initial position in the animation to start checking from * @return Time in seconds that notify would fire if anim was played at given rate * Returns -1.f if no notify is found */ native function float GetNotifyTimeByClass( class<AnimNotify> NotifyClass, optional float PlayRate = 1.f, optional float StartPosition = -1.f, optional out AnimNotify out_Notify, optional out float out_Duration ); defaultproperties { RateScale=1.0 } |
Overview | Package | Class | Source | Class tree | Glossary | UnrealScript Documentation |
previous class next class | frames no frames |