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

159 lines
4.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Stats/Stats.h"
#include "Toolkits/IToolkitHost.h"
#include "TickableEditorObject.h"
#include "EditorUndoClient.h"
#include "IDetailsView.h"
#include "ISkeletonEditor.h"
#include "Containers/ArrayView.h"
#include "IAnimationSequenceBrowser.h"
class IDetailLayoutBuilder;
class IPersonaToolkit;
class IPersonaViewport;
class ISkeletonTree;
class USkeleton;
class ISkeletonTreeItem;
struct FToolMenuContext;
namespace SkeletonEditorModes
{
// Mode identifiers
extern const FName SkeletonEditorMode;
}
namespace SkeletonEditorTabs
{
// Tab identifiers
extern const FName DetailsTab;
extern const FName SkeletonTreeTab;
extern const FName ViewportTab;
extern const FName AssetBrowserTab;
extern const FName AnimNotifiesTab;
extern const FName CurveMetadataTab;
extern const FName CurveDebuggerTab;
extern const FName AdvancedPreviewTab;
extern const FName RetargetManagerTab;
extern const FName SlotNamesTab;
extern const FName FindReplaceTab;
}
class FSkeletonEditor : public ISkeletonEditor, public FEditorUndoClient, public FTickableEditorObject
{
public:
FSkeletonEditor();
virtual ~FSkeletonEditor();
/** Edits the specified Skeleton object */
void InitSkeletonEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost>& InitToolkitHost, class USkeleton* InSkeleton);
/** IHasPersonaToolkit interface */
virtual TSharedRef<class IPersonaToolkit> GetPersonaToolkit() const override { return PersonaToolkit.ToSharedRef(); }
/** IToolkit interface */
virtual void RegisterTabSpawners(const TSharedRef<class FTabManager>& TabManager) override;
virtual void UnregisterTabSpawners(const TSharedRef<class FTabManager>& TabManager) override;
virtual FName GetToolkitFName() const override;
virtual FText GetBaseToolkitName() const override;
virtual FString GetWorldCentricTabPrefix() const override;
virtual FLinearColor GetWorldCentricTabColorScale() const override;
virtual void InitToolMenuContext(FToolMenuContext& MenuContext) override;
virtual IAnimationSequenceBrowser* GetAssetBrowser() const override;
/** Handle opening a new asset from the asset browser */
void HandleOpenNewAsset(UObject* InNewAsset);
/** FEditorUndoClient interface */
virtual void PostUndo(bool bSuccess) override;
virtual void PostRedo(bool bSuccess) override;
/** FTickableEditorObject Interface */
virtual void Tick(float DeltaTime) override;
virtual TStatId GetStatId() const override;
virtual ETickableTickType GetTickableTickType() const override { return ETickableTickType::Always; }
/** @return the documentation location for this editor */
virtual FString GetDocumentationLink() const override
{
return FString(TEXT("AnimatingObjects/SkeletalMeshAnimation/Persona/Modes/Skeleton"));
}
/** Get the skeleton tree widget */
TSharedRef<class ISkeletonTree> GetSkeletonTree() const { return SkeletonTree.ToSharedRef(); }
UObject* HandleGetAsset();
public:
void HandleObjectsSelected(const TArray<UObject*>& InObjects);
void HandleObjectSelected(UObject* InObject);
void HandleSelectionChanged(const TArrayView<TSharedPtr<ISkeletonTreeItem>>& InSelectedItems, ESelectInfo::Type InSelectInfo);
void HandleDetailsCreated(const TSharedRef<class IDetailsView>& InDetailsView);
void HandleAnimationSequenceBrowserCreated(const TSharedRef<class IAnimationSequenceBrowser>& InSequenceBrowser);
private:
void ExtendMenu();
void ExtendToolbar();
void BindCommands();
bool CanRemoveBones() const;
void RemoveUnusedBones();
void TestSkeletonCurveMetaDataForUse() const;
void UpdateSkeletonRefPose();
void OnAnimNotifyWindow();
void OnRetargetManager();
void OnImportAsset();
void HandleOnPreviewSceneSettingsCustomized(IDetailLayoutBuilder& DetailBuilder);
static TSharedPtr<FSkeletonEditor> GetSkeletonEditor(const FToolMenuContext& InMenuContext);
public:
/** Multicast delegate fired on global undo/redo */
FSimpleMulticastDelegate OnPostUndo;
/** Multicast delegate fired on curves changing */
FSimpleMulticastDelegate OnCurvesChanged;
private:
/** The skeleton we are editing */
USkeleton* Skeleton;
/** Toolbar extender */
TSharedPtr<FExtender> ToolbarExtender;
/** Menu extender */
TSharedPtr<FExtender> MenuExtender;
/** Persona toolkit */
TSharedPtr<class IPersonaToolkit> PersonaToolkit;
/** Skeleton tree */
TSharedPtr<class ISkeletonTree> SkeletonTree;
/** Viewport */
TSharedPtr<class IPersonaViewport> Viewport;
/** Details panel */
TSharedPtr<class IDetailsView> DetailsView;
/** Sequence Browser **/
TWeakPtr<class IAnimationSequenceBrowser> SequenceBrowser;
};