// 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& InitToolkitHost, class USkeleton* InSkeleton); /** IHasPersonaToolkit interface */ virtual TSharedRef GetPersonaToolkit() const override { return PersonaToolkit.ToSharedRef(); } /** IToolkit interface */ virtual void RegisterTabSpawners(const TSharedRef& TabManager) override; virtual void UnregisterTabSpawners(const TSharedRef& 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 GetSkeletonTree() const { return SkeletonTree.ToSharedRef(); } UObject* HandleGetAsset(); public: void HandleObjectsSelected(const TArray& InObjects); void HandleObjectSelected(UObject* InObject); void HandleSelectionChanged(const TArrayView>& InSelectedItems, ESelectInfo::Type InSelectInfo); void HandleDetailsCreated(const TSharedRef& InDetailsView); void HandleAnimationSequenceBrowserCreated(const TSharedRef& 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 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 ToolbarExtender; /** Menu extender */ TSharedPtr MenuExtender; /** Persona toolkit */ TSharedPtr PersonaToolkit; /** Skeleton tree */ TSharedPtr SkeletonTree; /** Viewport */ TSharedPtr Viewport; /** Details panel */ TSharedPtr DetailsView; /** Sequence Browser **/ TWeakPtr SequenceBrowser; };