// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Kismet/BlueprintFunctionLibrary.h" #include "Animation/AnimEnums.h" #include "Animation/AnimCurveTypes.h" #include "Animation/AnimMetaData.h" #include "AnimationBlueprintLibrary.generated.h" struct FRawAnimSequenceTrack; class UAnimCompress; class USkeleton; class UAnimBoneCompressionSettings; class UAnimCurveCompressionSettings; UENUM() enum class ESmartNameContainerType : uint8 { SNCT_CurveMapping UMETA(DisplayName = "Curve Names"), SNCT_TrackCurveMapping UMETA(DisplayName = "Track Curve Names"), SNCT_MAX }; /** Delegate called when a notify was replaced */ DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnNotifyReplaced, UAnimNotify*, OldNotify, UAnimNotify*, NewNotify); /** Delegate called when a notify state was replaced */ DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnNotifyStateReplaced, UAnimNotifyState*, OldNotifyState, UAnimNotifyState*, NewNotifyState); /** Blueprint library for altering and analyzing animation / skeletal data */ UCLASS(meta=(ScriptName="AnimationLibrary")) class ANIMATIONMODIFIERS_API UAnimationBlueprintLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: /** Retrieves the number of animation frames for the given Animation Sequence */ UFUNCTION(BlueprintPure, meta=(AutoCreateRefTerm = "AnimationSequence"), Category = "AnimationBlueprintLibrary|Animation") static void GetNumFrames(const UAnimSequence* AnimationSequence, int32& NumFrames); /** Retrieves the Names of the individual ATracks for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Animation") static void GetAnimationTrackNames(const UAnimSequence* AnimationSequence, TArray& TrackNames); /** Retrieves the Raw Translation Animation Data for the given Animation Track Name and Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RawTrackData") static void GetRawTrackPositionData(const UAnimSequence* AnimationSequence, const FName TrackName, TArray& PositionData); /** Retrieves the Raw Rotation Animation Data for the given Animation Track Name and Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RawTrackData") static void GetRawTrackRotationData(const UAnimSequence* AnimationSequence, const FName TrackName, TArray& RotationData ); /** Retrieves the Raw Scale Animation Data for the given Animation Track Name and Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RawTrackData") static void GetRawTrackScaleData(const UAnimSequence* AnimationSequence, const FName TrackName, TArray& ScaleData); /** Retrieves the Raw Animation Data for the given Animation Track Name and Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RawTrackData") static void GetRawTrackData(const UAnimSequence* AnimationSequence, const FName TrackName, TArray& PositionKeys,TArray& RotationKeys, TArray& ScalingKeys); /** Checks whether or not the given Animation Track Name is contained within the Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Helpers") static bool IsValidRawAnimationTrackName(const UAnimSequence* AnimationSequence, const FName TrackName); static const FRawAnimSequenceTrack& GetRawAnimationTrackByName(const UAnimSequence* AnimationSequence, const FName TrackName); // Compression /** Retrieves the Bone Compression Settings for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Compression") static void GetBoneCompressionSettings(const UAnimSequence* AnimationSequence, UAnimBoneCompressionSettings*& CompressionSettings); /** Sets the Bone Compression Settings for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Compression") static void SetBoneCompressionSettings(UAnimSequence* AnimationSequence, UAnimBoneCompressionSettings* CompressionSettings); /** Retrieves the Curve Compression Settings for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Compression") static void GetCurveCompressionSettings(const UAnimSequence* AnimationSequence, UAnimCurveCompressionSettings*& CompressionSettings); /** Sets the Curve Compression Settings for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Compression") static void SetCurveCompressionSettings(UAnimSequence* AnimationSequence, UAnimCurveCompressionSettings* CompressionSettings); // Additive /** Retrieves the Additive Animation type for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Additive") static void GetAdditiveAnimationType(const UAnimSequence* AnimationSequence, TEnumAsByte& AdditiveAnimationType); /** Sets the Additive Animation type for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Additive") static void SetAdditiveAnimationType(UAnimSequence* AnimationSequence, const TEnumAsByte AdditiveAnimationType); /** Retrieves the Additive Base Pose type for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Additive") static void GetAdditiveBasePoseType(const UAnimSequence* AnimationSequence, TEnumAsByte& AdditiveBasePoseType); /** Sets the Additive Base Pose type for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Additive") static void SetAdditiveBasePoseType(UAnimSequence* AnimationSequence, const TEnumAsByte AdditiveBasePoseType); // Interpolation /** Retrieves the Animation Interpolation type for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Interpolation") static void GetAnimationInterpolationType(const UAnimSequence* AnimationSequence, EAnimInterpolationType& InterpolationType); /** Sets the Animation Interpolation type for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Interpolation") static void SetAnimationInterpolationType(UAnimSequence* AnimationSequence, EAnimInterpolationType InterpolationType); // Root motion /** Checks whether or not Root Motion is Enabled for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RootMotion") static bool IsRootMotionEnabled(const UAnimSequence* AnimationSequence); /** Sets whether or not Root Motion is Enabled for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|RootMotion") static void SetRootMotionEnabled(UAnimSequence* AnimationSequence, bool bEnabled); /** Retrieves the Root Motion Lock Type for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RootMotion") static void GetRootMotionLockType(const UAnimSequence* AnimationSequence, TEnumAsByte& LockType); /** Sets the Root Motion Lock Type for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|RootMotion") static void SetRootMotionLockType(UAnimSequence* AnimationSequence, TEnumAsByte RootMotionLockType); /** Checks whether or not Root Motion locking is Forced for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|RootMotion") static bool IsRootMotionLockForced(const UAnimSequence* AnimationSequence); /** Sets whether or not Root Motion locking is Forced for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|RootMotion") static void SetIsRootMotionLockForced(UAnimSequence* AnimationSequence, bool bForced); // Markers /** Retrieves all the Animation Sync Markers for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MarkerSyncing") static void GetAnimationSyncMarkers(const UAnimSequence* AnimationSequence, TArray& Markers); /** Retrieves all the Unique Names for the Animation Sync Markers contained by the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MarkerSyncing") static void GetUniqueMarkerNames(const UAnimSequence* AnimationSequence, TArray& MarkerNames); /** Adds an Animation Sync Marker to Notify track in the given Animation with the corresponding Marker Name and Time */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MarkerSyncing") static void AddAnimationSyncMarker(UAnimSequence* AnimationSequence, FName MarkerName, float Time, FName NotifyTrackName); /** Checks whether or not the given Marker Name is a valid Animation Sync Marker Name */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static bool IsValidAnimationSyncMarkerName(const UAnimSequence* AnimationSequence, FName MarkerName); /** Removes All Animation Sync Marker found within the Animation Sequence whose name matches MarkerName, and returns the number of removed instances */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MarkerSyncing") static int32 RemoveAnimationSyncMarkersByName(UAnimSequence* AnimationSequence, FName MarkerName); /** Removes All Animation Sync Marker found within the Animation Sequence that belong to the specific Notify Track, and returns the number of removed instances */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MarkerSyncing") static int32 RemoveAnimationSyncMarkersByTrack(UAnimSequence* AnimationSequence, FName NotifyTrackName); /** Removes All Animation Sync Markers found within the Animation Sequence, and returns the number of removed instances */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MarkerSyncing") static void RemoveAllAnimationSyncMarkers(UAnimSequence* AnimationSequence); // Notifies /** Retrieves all Animation Notify Events found within the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|NotifyEvents") static void GetAnimationNotifyEvents(const UAnimSequence* AnimationSequence, TArray& NotifyEvents); /** Retrieves all Unique Animation Notify Events found within the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|NotifyEvents") static void GetAnimationNotifyEventNames(const UAnimSequence* AnimationSequence, TArray& EventNames); /** Adds an Animation Notify Event to Notify track in the given Animation with the given Notify creation data */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static UAnimNotify* AddAnimationNotifyEvent(UAnimSequence* AnimationSequence, FName NotifyTrackName, float StartTime, TSubclassOf NotifyClass); /** Adds an Animation Notify State Event to Notify track in the given Animation with the given Notify State creation data */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static UAnimNotifyState* AddAnimationNotifyStateEvent(UAnimSequence* AnimationSequence, FName NotifyTrackName, float StartTime, float Duration, TSubclassOf NotifyStateClass); /** Adds an the specific Animation Notify to the Animation Sequence (requires Notify's outer to be the Animation Sequence) */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static void AddAnimationNotifyEventObject(UAnimSequence* AnimationSequence, float StartTime, UAnimNotify* Notify, FName NotifyTrackName); /** Adds an the specific Animation Notify State to the Animation Sequence (requires Notify State's outer to be the Animation Sequence) */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static void AddAnimationNotifyStateEventObject(UAnimSequence* AnimationSequence, float StartTime, float Duration, UAnimNotifyState* NotifyState, FName NotifyTrackName); /** Removes Animation Notify Events found by Name within the Animation Sequence, and returns the number of removed name instances */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static int32 RemoveAnimationNotifyEventsByName(UAnimSequence* AnimationSequence, FName NotifyName); /** Removes Animation Notify Events found by Track within the Animation Sequence, and returns the number of removed name instances */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static int32 RemoveAnimationNotifyEventsByTrack(UAnimSequence* AnimationSequence, FName NotifyTrackName); /** Replaces animation notifies in the specified Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static void ReplaceAnimNotifyStates(UAnimSequenceBase* AnimationSequence, TSubclassOf OldNotifyClass, TSubclassOf NewNotifyClass, FOnNotifyStateReplaced OnNotifyStateReplaced); /** Replaces animation notifies in the specified Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static void ReplaceAnimNotifies(UAnimSequenceBase* AnimationSequence, TSubclassOf OldNotifyClass, TSubclassOf NewNotifyClass, FOnNotifyReplaced OnNotifyReplaced); /** Copies animation notifies from Src Animation Sequence to Dest. Creates anim notify tracks as necessary. Returns true on success. */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|NotifyEvents") static void CopyAnimNotifiesFromSequence(UAnimSequence* SrcAnimSequence, UAnimSequence* DestAnimSequence); // Notify Tracks /** Retrieves all Unique Animation Notify Track Names found within the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|AnimationNotifies") static void GetAnimationNotifyTrackNames(const UAnimSequence* AnimationSequence, TArray& TrackNames); /** Adds an Animation Notify Track to the Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|AnimationNotifies") static void AddAnimationNotifyTrack(UAnimSequence* AnimationSequence, FName NotifyTrackName, FLinearColor TrackColor = FLinearColor::White); /** Removes an Animation Notify Track from Animation Sequence by Name */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|AnimationNotifies") static void RemoveAnimationNotifyTrack(UAnimSequence* AnimationSequence, FName NotifyTrackName); /** Removes All Animation Notify Tracks from Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|AnimationNotifies") static void RemoveAllAnimationNotifyTracks(UAnimSequence* AnimationSequence); /** Checks whether or not the given Track Name is a valid Animation Notify Track in the Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static bool IsValidAnimNotifyTrackName(const UAnimSequence* AnimationSequence, FName NotifyTrackName); static int32 GetTrackIndexForAnimationNotifyTrackName(const UAnimSequence* AnimationSequence, FName NotifyTrackName); static const FAnimNotifyTrack& GetNotifyTrackByName(const UAnimSequence* AnimationSequence, FName NotifyTrackName); /** Returns the actual trigger time for a NotifyEvent */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|AnimationNotifies") static float GetAnimNotifyEventTriggerTime(const FAnimNotifyEvent& NotifyEvent); /** Retrieves all Animation Sync Markers for the given Notify Track Name from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MarkerSyncing") static void GetAnimationSyncMarkersForTrack(const UAnimSequence* AnimationSequence, FName NotifyTrackName, TArray& Markers); /** Retrieves all Animation Notify Events for the given Notify Track Name from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|NotifyEvents") static void GetAnimationNotifyEventsForTrack(const UAnimSequence* AnimationSequence, FName NotifyTrackName, TArray& Events); // Curves /** Adds an Animation Curve by Type and Name to the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddCurve(UAnimSequence* AnimationSequence, FName CurveName, ERawCurveTrackTypes CurveType = ERawCurveTrackTypes::RCT_Float, bool bMetaDataCurve = false); /** Removes an Animation Curve by Name from the given Animation Sequence (Raw Animation Curves [Names] may not be removed from the Skeleton) */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void RemoveCurve(UAnimSequence* AnimationSequence, FName CurveName, bool bRemoveNameFromSkeleton = false); /** Removes all Animation Curve Data from the given Animation Sequence (Raw Animation Curves [Names] may not be removed from the Skeleton) */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void RemoveAllCurveData(UAnimSequence* AnimationSequence); /** Adds a Transformation Key to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddTransformationCurveKey(UAnimSequence* AnimationSequence, FName CurveName, const float Time, const FTransform& Transform); /** Adds a multiple of Transformation Keys to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddTransformationCurveKeys(UAnimSequence* AnimationSequence, FName CurveName, const TArray& Times, const TArray& Transforms); /** Adds a Float Key to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddFloatCurveKey(UAnimSequence* AnimationSequence, FName CurveName, const float Time, const float Value); /** Adds a multiple of Float Keys to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddFloatCurveKeys(UAnimSequence* AnimationSequence, FName CurveName, const TArray& Times, const TArray& Values); /** Adds a Vector Key to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddVectorCurveKey(UAnimSequence* AnimationSequence, FName CurveName, const float Time, const FVector Vector); /** Adds a multiple of Vector Keys to the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void AddVectorCurveKeys(UAnimSequence* AnimationSequence, FName CurveName, const TArray& Times, const TArray& Vectors); // Curve helper functions template static void AddCurveKeysInternal(UAnimSequence* AnimationSequence, FName CurveName, const TArray& Times, const TArray& KeyData, ERawCurveTrackTypes CurveType); // Returns true if successfully added, false if it was already existing static bool AddCurveInternal(UAnimSequence* AnimationSequence, FName CurveName, FName ContainerName, int32 CurveFlags, ERawCurveTrackTypes SupportedCurveType); static bool RemoveCurveInternal(UAnimSequence* AnimationSequence, FName CurveName, FName ContainerName, bool bRemoveNameFromSkeleton); /** Checks whether or not the given Bone Name exist on the Skeleton referenced by the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Skeleton") static void DoesBoneNameExist(UAnimSequence* AnimationSequence, FName BoneName, bool& bExists); static bool DoesBoneNameExistInternal(USkeleton* Skeleton, FName BoneName); /** Retrieves, a multiple of, Float Key(s) from the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void GetFloatKeys(UAnimSequence* AnimationSequence, FName CurveName, TArray& Times, TArray& Values); /** Retrieves, a multiple of, Vector Key(s) from the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void GetVectorKeys(UAnimSequence* AnimationSequence, FName CurveName, TArray& Times, TArray& Values); /** Retrieves, a multiple of, Transformation Key(s) from the specified Animation Curve inside of the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void GetTransformationKeys(UAnimSequence* AnimationSequence, FName CurveName, TArray& Times, TArray& Values); template static void GetCurveKeysInternal(UAnimSequence* AnimationSequence, FName CurveName, TArray& Times, TArray& KeyData, ERawCurveTrackTypes CurveType); // Bone Tracks /** Removes an Animation Curve by Name from the given Animation Sequence (Raw Animation Curves [Names] may not be removed from the Skeleton) * * @param AnimationSequence : AnimSequence * @param BoneName : Name of bone track user wants to remove * @param bIncludeChildren : true if user wants to include all children of BoneName * @param bFinalize : If you set this to true, it will trigger compression. If you set bFinalize to be false, you'll have to manually trigger Finalize. */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Bones") static void RemoveBoneAnimation(UAnimSequence* AnimationSequence, FName BoneName, bool bIncludeChildren = true, bool bFinalize = true); /** Removes all Animation Bone Track Data from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void RemoveAllBoneAnimation(UAnimSequence* AnimationSequence); /** Apply all the changes made to Bone Tracks to Finalize. This triggers recompression. Note that this is expensive, but will require to get correct compressed data */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static void FinalizeBoneAnimation(UAnimSequence* AnimationSequence); // Smart name helper functions /** Checks whether or not the given Curve Name exist on the Skeleton referenced by the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Curves") static bool DoesCurveExist(UAnimSequence* AnimationSequence, FName CurveName, ERawCurveTrackTypes CurveType); static bool DoesSmartNameExist(UAnimSequence* AnimationSequence, FName Name); static FSmartName RetrieveSmartNameForCurve(const UAnimSequence* AnimationSequence, FName CurveName, FName ContainerName); static bool RetrieveSmartNameForCurve(const UAnimSequence* AnimationSequence, FName CurveName, FName ContainerName, FSmartName& SmartName); static FName RetrieveContainerNameForCurve(const UAnimSequence* AnimationSequence, FName CurveName); // MetaData /** Creates and Adds an instance of the specified MetaData Class to the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MetaData") static void AddMetaData(UAnimSequence* AnimationSequence, TSubclassOf MetaDataClass, UAnimMetaData*& MetaDataInstance); /** Adds an instance of the specified MetaData Class to the given Animation Sequence (requires MetaDataObject's outer to be the Animation Sequence) */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MetaData") static void AddMetaDataObject(UAnimSequence* AnimationSequence, UAnimMetaData* MetaDataObject); /** Removes all Meta Data from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MetaData") static void RemoveAllMetaData(UAnimSequence* AnimationSequence); /** Removes the specified Meta Data Instance from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MetaData") static void RemoveMetaData(UAnimSequence* AnimationSequence, UAnimMetaData* MetaDataObject); /** Removes all Meta Data Instance of the specified Class from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|MetaData") static void RemoveMetaDataOfClass(UAnimSequence* AnimationSequence, TSubclassOf MetaDataClass); /** Retrieves all Meta Data Instances from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MetaData") static void GetMetaData(const UAnimSequence* AnimationSequence, TArray& MetaData); /** Retrieves all Meta Data Instances from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MetaData") static void GetMetaDataOfClass(const UAnimSequence* AnimationSequence, TSubclassOf MetaDataClass, TArray& MetaDataOfClass); /** Checks whether or not the given Animation Sequences contains Meta Data Instance of the specified Meta Data Class */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|MetaData") static bool ContainsMetaDataOfClass(const UAnimSequence* AnimationSequence, TSubclassOf MetaDataClass); // Poses /** Retrieves Bone Pose data for the given Bone Name at the specified Time from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Pose") static void GetBonePoseForTime(const UAnimSequence* AnimationSequence, FName BoneName, float Time, bool bExtractRootMotion, FTransform& Pose); /** Retrieves Bone Pose data for the given Bone Name at the specified Frame from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Pose") static void GetBonePoseForFrame(const UAnimSequence* AnimationSequence, FName BoneName, int32 Frame, bool bExtractRootMotion, FTransform& Pose); /** Retrieves Bone Pose data for the given Bone Names at the specified Time from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Pose") static void GetBonePosesForTime(const UAnimSequence* AnimationSequence, TArray BoneNames, float Time, bool bExtractRootMotion, TArray& Poses, const USkeletalMesh* PreviewMesh = nullptr); /** Retrieves Bone Pose data for the given Bone Names at the specified Frame from the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Pose") static void GetBonePosesForFrame(const UAnimSequence* AnimationSequence, TArray BoneNames, int32 Frame, bool bExtractRootMotion, TArray& Poses, const USkeletalMesh* PreviewMesh = nullptr); // Virtual bones /** Adds a Virtual Bone between the Source and Target Bones to the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|VirtualBones") static void AddVirtualBone(const UAnimSequence* AnimationSequence, FName SourceBoneName, FName TargetBoneName, FName& VirtualBoneName); /** Removes a Virtual Bone with the specified Bone Name from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|VirtualBones") static void RemoveVirtualBone(const UAnimSequence* AnimationSequence, FName VirtualBoneName); /** Removes Virtual Bones with the specified Bone Names from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|VirtualBones") static void RemoveVirtualBones(const UAnimSequence* AnimationSequence, TArray VirtualBoneNames); /** Removes all Virtual Bones from the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|VirtualBones") static void RemoveAllVirtualBones(const UAnimSequence* AnimationSequence); static bool DoesVirtualBoneNameExistInternal(USkeleton* Skeleton, FName BoneName); // Misc /** Retrieves the Length of the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Animation") static void GetSequenceLength(const UAnimSequence* AnimationSequence, float& Length); /** Retrieves the (Play) Rate Scale of the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Animation") static void GetRateScale(const UAnimSequence* AnimationSequence, float& RateScale); /** Sets the (Play) Rate Scale for the given Animation Sequence */ UFUNCTION(BlueprintCallable, Category = "AnimationBlueprintLibrary|Animation") static void SetRateScale(UAnimSequence* AnimationSequence, float RateScale); /** Retrieves the Frame Index at the specified Time Value for the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static void GetFrameAtTime(const UAnimSequence* AnimationSequence, const float Time, int32& Frame); /** Retrieves the Time Value at the specified Frame Indexfor the given Animation Sequence */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static void GetTimeAtFrame(const UAnimSequence* AnimationSequence, const int32 Frame, float& Time); static float GetTimeAtFrameInternal(const UAnimSequence* AnimationSequence, const int32 Frame); /** Checks whether or not the given Time Value lies within the given Animation Sequence's Length */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static void IsValidTime(const UAnimSequence* AnimationSequence, const float Time, bool& IsValid); static bool IsValidTimeInternal(const UAnimSequence* AnimationSequence, const float Time); /** Finds the Bone Path from the given Bone to the Root Bone */ UFUNCTION(BlueprintPure, Category = "AnimationBlueprintLibrary|Helpers") static void FindBonePathToRoot(const UAnimSequence* AnimationSequence, FName BoneName, TArray& BonePath); static const FName SmartContainerNames[(int32)ESmartNameContainerType::SNCT_MAX]; };