Files
FunnyGirl/Source/FunnyGirlEditor/Private/Morph/AnimTimeline/SAnimEditorBase.cpp
T
2026-05-19 13:42:41 +07:00

102 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Morph/AnimTimeline/SAnimEditorBase.h"
#include "AnimPreviewInstance.h"
#include "Animation/AnimSequenceBase.h"
#include "Animation/BlendSpace.h"
#include "Animation/DebugSkelMeshComponent.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/SOverlay.h"
void SAnimEditorBase::Construct(const FArguments& InArgs, const TSharedPtr<IPersonaPreviewScene>& InPreviewScene)
{
PreviewScenePtr = InPreviewScene;
OnObjectsSelectedDelegate = InArgs._OnObjectsSelected;
SetInputViewRange(0.0f, GetSequenceLength());
const TSharedRef<SWidget> TimelineWidget = InArgs._DisplayAnimTimeline
? CreateAnimTimelineWidget()
: SNullWidget::NullWidget;
TSharedPtr<SVerticalBox> RootBox;
ChildSlot
[
SAssignNew(RootBox, SVerticalBox)
+ SVerticalBox::Slot()
.FillHeight(1.0f)
[
SNew(SOverlay)
+ SOverlay::Slot()
[
SAssignNew(NonScrollEditorPanels, SVerticalBox)
]
+ SOverlay::Slot()
[
TimelineWidget
]
]
];
if (InArgs._DisplayAnimScrubBar)
{
RootBox->AddSlot()
.AutoHeight()
[
ConstructAnimScrubPanel(InArgs._DisplayAnimScrubBarEditing)
];
}
}
void SAnimEditorBase::SetInputViewRange(float InViewMinInput, float InViewMaxInput)
{
ViewMaxInput = FMath::Min(InViewMaxInput, GetSequenceLength());
ViewMinInput = FMath::Max(InViewMinInput, 0.0f);
}
float SAnimEditorBase::GetScrubValue() const
{
if (PreviewScenePtr.IsValid())
{
if (UDebugSkelMeshComponent* PreviewMesh = PreviewScenePtr.Pin()->GetPreviewMeshComponent())
{
if (PreviewMesh->PreviewInstance)
{
return PreviewMesh->PreviewInstance->GetCurrentTime();
}
}
}
return 0.0f;
}
void SAnimEditorBase::OnSelectionChanged(const TArray<UObject*>& SelectedItems)
{
OnObjectsSelectedDelegate.ExecuteIfBound(SelectedItems);
}
TSharedRef<SWidget> SAnimEditorBase::CreateDocumentAnchor()
{
return SNullWidget::NullWidget;
}
TSharedRef<SWidget> SAnimEditorBase::ConstructAnimScrubPanel(bool bDisplayAnimScrubBarEditing)
{
return SNullWidget::NullWidget;
}
float SAnimEditorBase::GetSequenceLength() const
{
if (const UAnimSequenceBase* AnimSequence = Cast<UAnimSequenceBase>(GetEditorObject()))
{
return AnimSequence->GetPlayLength();
}
if (const UBlendSpace* BlendSpace = Cast<UBlendSpace>(GetEditorObject()))
{
return 1.0f;
}
return 0.0f;
}