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

90 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "InputCoreTypes.h"
#include "EditorModeTools.h"
#include "EdMode.h"
#include "ISequencer.h"
#include "Components/SkeletalMeshComponent.h"
#include "Sections/MovieSceneSkeletalAnimationSection.h"
#include "EntitySystem/Interrogation/MovieSceneInterrogationLinker.h"
struct HMovieSceneSkeletalAnimationRootHitProxy;
struct FSelectedRootData
{
FSelectedRootData(UMovieSceneSkeletalAnimationSection* InSection, USkeletalMeshComponent* InComp);
bool operator == (const FSelectedRootData& InData) const { return (InData.SelectedSection == SelectedSection && InData.SelectedMeshComp == SelectedMeshComp); }
void CalcTransform(const FFrameTime& Frametime, FTransform& OutTransform, FTransform& OutParentTransform);
TWeakObjectPtr<UMovieSceneSkeletalAnimationSection> SelectedSection;
TWeakObjectPtr<USkeletalMeshComponent> SelectedMeshComp;
};
class FSkeletalAnimationTrackEditMode : public FEdMode
{
public:
static FName ModeName;
FSkeletalAnimationTrackEditMode();
~FSkeletalAnimationTrackEditMode();
// FEdMode interface
virtual bool UsesToolkits() const override;
virtual void Enter() override;
virtual void Exit() override;
virtual void Tick(FEditorViewportClient* ViewportClient, float DeltaTime) override;
virtual void Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI) override;
virtual bool InputKey(FEditorViewportClient* InViewportClient, FViewport* InViewport, FKey InKey, EInputEvent InEvent) override;
virtual bool EndTracking(FEditorViewportClient* InViewportClient, FViewport* InViewport) override;
virtual bool StartTracking(FEditorViewportClient* InViewportClient, FViewport* InViewport) override;
virtual bool HandleClick(FEditorViewportClient* InViewportClient, HHitProxy *HitProxy, const FViewportClick &Click) override;
virtual void SelectNone() override;
virtual bool InputDelta(FEditorViewportClient* InViewportClient, FViewport* InViewport, FVector& InDrag, FRotator& InRot, FVector& InScale) override;
virtual bool UsesTransformWidget() const override;
virtual bool UsesTransformWidget(UE::Widget::EWidgetMode CheckMode) const;
virtual FVector GetWidgetLocation() const override;
virtual bool ShouldDrawWidget() const override;
virtual bool GetPivotForOrbit(FVector& OutPivot) const override;
virtual bool GetCustomDrawingCoordinateSystem(FMatrix& OutMatrix, void* InData) override;
virtual bool GetCustomInputCoordinateSystem(FMatrix& OutMatrix, void* InData) override;
virtual bool IsCompatibleWith(FEditorModeID OtherModeID) const override;
//GCObject
virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
void OnKeySelected(FViewport* Viewport, HMovieSceneSkeletalAnimationRootHitProxy* KeyProxy);
/** Set The owning sequencer*/
void SetSequencer(const TSharedPtr<ISequencer>& InSequencer) { WeakSequencer = InSequencer; }
protected:
bool IsSomethingSelected() const;
bool GetTransformAtFirstSectionStart(FTransform& OutWorld, FTransform& OutParent) const;
bool IsRootSelected(UMovieSceneSkeletalAnimationSection* Section) const;
protected:
/** Interrogator that is an gc object */
UE::MovieScene::FSystemInterrogator InterrogationLinker;
/** Sequencer that owns me*/
TWeakPtr<ISequencer> WeakSequencer;
/** Whether we are in the middle of a transaction */
bool bIsTransacting;
/** Whether a manipulator actually made a change when transacting */
bool bManipulatorMadeChange;
/** Array of Selected Root Setions*/
TArray<FSelectedRootData> SelectedRootData;
/** Cached location of root transform*/
FTransform RootTransform;
};