Files
UnrealEngine/Engine/Source/Editor/SkeletonEditor/Public/IEditableSkeleton.h
2025-05-18 13:04:45 +08:00

229 lines
9.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "BoneContainer.h"
#include "Animation/Skeleton.h"
enum class EBlendProfileMode : uint8;
class UBlendProfile;
class USkeletalMesh;
/** Delegate fired when a set of smart names is removed */
DECLARE_MULTICAST_DELEGATE_OneParam(FOnSmartNameChanged, const FName& /*InContainerName*/);
/** Enum which tells us whether the parent of a socket is the skeleton or skeletal mesh */
enum class ESocketParentType : int32
{
Skeleton,
Mesh
};
/** Interface used to deal with skeletons that are currently being edited */
class IEditableSkeleton
{
public:
/** Get the skeleton. Const - to modify the skeleton you should use the wrapper methods below */
virtual const class USkeleton& GetSkeleton() const = 0;
/** Checks to see if the editable skeleton is valid. It is possible to force-delete the USkeleton. */
virtual bool IsSkeletonValid() const = 0;
/** Get the blend profiles that this skeleton currently contains */
virtual const TArray<class UBlendProfile*>& GetBlendProfiles() const = 0;
/** Get the named blend profile @return nullptr if none was found */
virtual class UBlendProfile* GetBlendProfile(const FName& InBlendProfileName) = 0;
/** Create the named blend profile */
virtual class UBlendProfile* CreateNewBlendProfile(const FName& InBlendProfileName) = 0;
/** Remove the specifed blend profile */
virtual void RemoveBlendProfile(UBlendProfile* InBlendProfile) = 0;
/** Rename an existing blend profile */
virtual class UBlendProfile* RenameBlendProfile(const FName& InBlendProfileName, const FName& InNewBlendProfileName) = 0;
/** Set the blend profile scale for the specified bone */
virtual void SetBlendProfileScale(const FName& InBlendProfileName, const FName& InBoneName, float InNewScale, bool bInRecurse) = 0;
/** Change an existing blend profile's mode (See EBlendProfileMode for details) */
virtual void SetBlendProfileMode(FName InBlendProfileName, EBlendProfileMode ProfileMode) = 0;
/** Creates a new socket on the skeleton */
virtual USkeletalMeshSocket* AddSocket(const FName& InBoneName) = 0;
/** Handle drag-drop socket duplication */
virtual class USkeletalMeshSocket* DuplicateSocket(const struct FSelectedSocketInfo& SocketInfoToDuplicate, const FName& NewParentBoneName, USkeletalMesh* InSkeletalMesh) = 0;
/** Rename a socket on the mesh or the skeleton */
virtual void RenameSocket(const FName OldSocketName, const FName NewSocketName, USkeletalMesh* InSkeletalMesh) = 0;
/** Set the parent of a socket */
virtual void SetSocketParent(const FName& SocketName, const FName& NewParentName, USkeletalMesh* InSkeletalMesh, bool bKeepAbsoluteLocation = false) = 0;
/** Function to tell you if a socket name already exists. SocketParentType determines where we will look to see if the socket exists, i.e. mesh or skeleton */
virtual bool DoesSocketAlreadyExist(const class USkeletalMeshSocket* InSocket, const FText& InSocketName, ESocketParentType SocketParentType, USkeletalMesh* InSkeletalMesh) const = 0;
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::AddCurveMetaData.")
virtual bool AddSmartname(const FName& InContainerName, const FName& InNewName, FSmartName& OutSmartName) { return false; }
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::RenameCurveMetaData.")
virtual void RenameSmartname(const FName InContainerName, SmartName::UID_Type InNameUid, const FName InNewName) {}
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::RemoveCurveMetaData.")
virtual void RemoveSmartnamesAndFixupAnimations(const FName& InContainerName, const TArray<FName>& InNames) {}
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::SetCurveMetaDataMaterial.")
virtual void SetCurveMetaDataMaterial(const FSmartName& CurveName, bool bOverrideMaterial) {}
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::SetCurveMetaDataMorphTarget.")
virtual void SetCurveMetaDataMorphTarget(const FSmartName& CurveName, bool bOverrideMorphTarget) {}
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::SetCurveMetaDataBoneLinks.")
virtual void SetCurveMetaBoneLinks(const FSmartName& CurveName, const TArray<FBoneReference>& BoneLinks, uint8 InMaxLOD) {}
/**
* Makes sure all attached objects are valid and removes any that aren't.
*
* @return NumberOfBrokenAssets
*/
virtual int32 ValidatePreviewAttachedObjects() = 0;
/**
* Merge has failed, then Recreate BoneTree
*
* This will invalidate all animations that were linked before, but this is needed
*
* @param InSkelMesh : Mesh to build from.
*
* @return true if success
*/
virtual void RecreateBoneTree(class USkeletalMesh* NewPreviewMesh) = 0;
/**
* Delete anim notifies by name
* @return the number of animations modified
*/
virtual int32 DeleteAnimNotifies(const TArray<FName>& InotifyNames, bool bDeleteFromAnimations = true) = 0;
/**
* Delete sync markers from the skeleton cache by name
* @return the number of animations modified
*/
virtual int32 DeleteSyncMarkers(const TArray<FName>& ISyncMarkerNames, bool bDeleteFromAnimations = true) = 0;
/**
* Add a notify
*/
virtual void AddNotify(FName NewName) = 0;
/**
* Rename a notify
* @return the number of animations modified
*/
virtual int32 RenameNotify(const FName NewName, const FName OldName, bool bRenameInAnimations = true) = 0;
/**
* Add a sync marker
*/
virtual void AddSyncMarker(FName NewName) = 0;
/**
* Rename a sync marker
* @return the number of animations modified
*/
virtual int32 RenameSyncMarker(FName NewName, const FName OldName, bool bRenameInAnimations = true) = 0;
/** Inform the system that something about a notify changed */
virtual void BroadcastNotifyChanged() = 0;
/** Populates OutAssets with the AnimSequences that match this current skeleton */
virtual void GetCompatibleAnimSequences(TArray<struct FAssetData>& OutAssets) = 0;
/** Set the preview mesh in the skeleton*/
virtual void SetPreviewMesh(class USkeletalMesh* InSkeletalMesh) = 0;
/** Load any additional meshes we may have */
virtual void LoadAdditionalPreviewSkeletalMeshes() = 0;
/** Set the additional skeletal meshes we use when previewing this skeleton */
virtual void SetAdditionalPreviewSkeletalMeshes(class UDataAsset* InPreviewCollectionAsset) = 0;
/** Rename the specified retarget source */
virtual void RenameRetargetSource(const FName InOldName, const FName InNewName) = 0;
/** Add a retarget source */
virtual void AddRetargetSource(const FName& InName, USkeletalMesh* InReferenceMesh) = 0;
/** Delete retarget sources */
virtual void DeleteRetargetSources(const TArray<FName>& InRetargetSourceNames) = 0;
/** Refresh retarget sources */
virtual void RefreshRetargetSources(const TArray<FName>& InRetargetSourceNames) = 0;
/** Add a compatible skeleton */
virtual void AddCompatibleSkeleton(const USkeleton* InCompatibleSkeleton) = 0;
/** Remove a compatible skeleton */
virtual void RemoveCompatibleSkeleton(const USkeleton* InCompatibleSkeleton) = 0;
/** Remove any bones that are not used by any skeletal meshes */
virtual void RemoveUnusedBones() = 0;
/** Create RefLocalPoses from InSkeletalMesh */
virtual void UpdateSkeletonReferencePose(class USkeletalMesh* InSkeletalMesh) = 0;
/** Register a slot node */
virtual void RegisterSlotNode(const FName& InSlotName) = 0;
/** Add a slot group name */
virtual bool AddSlotGroupName(const FName& InSlotName) = 0;
/** Set the group name of the specified slot */
virtual void SetSlotGroupName(const FName& InSlotName, const FName& InGroupName) = 0;
/** Delete a slot name */
virtual void DeleteSlotName(const FName& InSlotName) = 0;
/** Delete a slot group */
virtual void DeleteSlotGroup(const FName& InGroupName) = 0;
/** Rename a slot name */
virtual void RenameSlotName(const FName InOldSlotName, const FName InNewSlotName) = 0;
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::RegisterOnCurveMetaDataChanged.")
virtual FDelegateHandle RegisterOnSmartNameChanged(const FOnSmartNameChanged::FDelegate& InOnSmartNameChanged) { return FDelegateHandle(); }
UE_DEPRECATED(5.3, "Please use IInterface_AnimCurveMetaData::UnegisterOnCurveMetaDataChanged.")
virtual void UnregisterOnSmartNameChanged(FDelegateHandle InHandle) {}
/** Register a delegate to be called when this skeletons notifies are changed */
virtual void RegisterOnNotifiesChanged(const FSimpleMulticastDelegate::FDelegate& InDelegate) = 0;
/** Unregister a delegate to be called when this skeletons notifies are changed */
virtual void UnregisterOnNotifiesChanged(FDelegateUserObject Thing) = 0;
/** Register a delegate to be called when this skeletons slots are changed */
virtual FDelegateHandle RegisterOnSlotsChanged(const FSimpleMulticastDelegate::FDelegate& InDelegate) = 0;
/** Unregister a delegate to be called when this skeletons slots are changed */
virtual void UnregisterOnSlotsChanged(FDelegateHandle InHandle) = 0;
/** Wrap USkeleton::SetBoneTranslationRetargetingMode */
virtual void SetBoneTranslationRetargetingMode(FName InBoneName, EBoneTranslationRetargetingMode::Type NewRetargetingMode) = 0;
/** Wrap USkeleton::GetBoneTranslationRetargetingMode */
virtual EBoneTranslationRetargetingMode::Type GetBoneTranslationRetargetingMode(FName InBoneName) const = 0;
/** Function to tell you if a virtual bone name is already in use */
virtual bool DoesVirtualBoneAlreadyExist(const FString& InVBName) const = 0;
/** Rename an existing virtual bone */
virtual void RenameVirtualBone(const FName OriginalName, const FName InVBName) = 0;
/** Broadcasts tree refresh delegate */
virtual void RefreshBoneTree() = 0;
};