Files
UnrealEngine/Engine/Source/Editor/MovieSceneTools/Private/Channels/TimeWarpChannelCurveModel.cpp
2025-05-18 13:04:45 +08:00

129 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Channels/TimeWarpChannelCurveModel.h"
#include "Channels/PiecewiseCurveModel.h"
#include "Variants/MovieScenePlayRateCurve.h"
#include "CurveEditor.h"
#include "MovieScene.h"
FTimeWarpChannelCurveModel::FTimeWarpChannelCurveModel(TMovieSceneChannelHandle<FMovieSceneTimeWarpChannel> InChannel, UMovieSceneSection* InOwningSection, UObject* InOwningObject, TWeakPtr<ISequencer> InWeakSequencer)
: FDoubleChannelCurveModel(InChannel, InOwningSection, InOwningObject, InWeakSequencer)
{
}
void FTimeWarpChannelCurveModel::SetCurveAttributes(const FCurveAttributes& InCurveAttributes)
{
FCurveAttributes FinalAttributes = InCurveAttributes;
const FMovieSceneTimeWarpChannel* Channel = static_cast<const FMovieSceneTimeWarpChannel*>(GetChannelHandle().Get());
// Disallow certain extrapolation modes for play rate curves.
if (Channel && Channel->Domain == UE::MovieScene::ETimeWarpChannelDomain::PlayRate)
{
FCurveAttributes ExistingAttributes;
GetCurveAttributes(ExistingAttributes);
if (InCurveAttributes.HasPreExtrapolation())
{
switch (InCurveAttributes.GetPreExtrapolation())
{
case RCCE_Cycle:
case RCCE_CycleWithOffset:
case RCCE_Oscillate:
if (ExistingAttributes.HasPreExtrapolation())
{
FinalAttributes.SetPreExtrapolation(ExistingAttributes.GetPreExtrapolation());
}
else
{
FinalAttributes.SetPreExtrapolation(RCCE_None);
}
break;
default:
break;
}
}
if (InCurveAttributes.HasPostExtrapolation())
{
switch (InCurveAttributes.GetPostExtrapolation())
{
case RCCE_Cycle:
case RCCE_CycleWithOffset:
case RCCE_Oscillate:
if (ExistingAttributes.HasPostExtrapolation())
{
FinalAttributes.SetPostExtrapolation(ExistingAttributes.GetPostExtrapolation());
}
else
{
FinalAttributes.SetPostExtrapolation(RCCE_None);
}
break;
default:
break;
}
}
}
FDoubleChannelCurveModel::SetCurveAttributes(FinalAttributes);
}
void FTimeWarpChannelCurveModel::GetCurveAttributes(FCurveAttributes& OutCurveAttributes) const
{
FDoubleChannelCurveModel::GetCurveAttributes(OutCurveAttributes);
}
void FTimeWarpChannelCurveModel::AllocateAxes(FCurveEditor* InCurveEditor, TSharedPtr<FCurveEditorAxis>& OutHorizontalAxis, TSharedPtr<FCurveEditorAxis>& OutVerticalAxis) const
{
FMovieSceneTimeWarpChannel* Channel = static_cast<FMovieSceneTimeWarpChannel*>(GetChannelHandle().Get());
if (Channel && Channel->Domain == UE::MovieScene::ETimeWarpChannelDomain::Time)
{
OutVerticalAxis = InCurveEditor->FindAxis("FocusedSequenceTime");
}
}
void FTimeWarpChannelCurveModel::MakeChildCurves(TArray<TUniquePtr<FCurveModel>>& OutChildCurves) const
{
using namespace UE::MovieScene;
const FMovieSceneChannelMetaData* MetaData = GetChannelHandle().GetMetaData();
if (!MetaData)
{
return;
}
UMovieScenePlayRateCurve* Owner = Cast<UMovieScenePlayRateCurve>(MetaData->WeakOwningObject.Get());
if (!Owner)
{
return;
}
struct FTimeDomainPiecewiseCurveModel : FPiecewiseCurveModel
{
void AllocateAxes(FCurveEditor* InCurveEditor, TSharedPtr<FCurveEditorAxis>& OutHorizontalAxis, TSharedPtr<FCurveEditorAxis>& OutVerticalAxis) const
{
OutVerticalAxis = InCurveEditor->FindAxis("FocusedSequenceTime");
}
};
TUniquePtr<FTimeDomainPiecewiseCurveModel> Model = MakeUnique<FTimeDomainPiecewiseCurveModel>();
Model->CurveAttribute = MakeAttributeLambda([Owner]{ return &Owner->GetTimeWarpCurve(); });
Model->FrameRateAttribute = Owner->GetTypedOuter<UMovieScene>()->GetTickResolution();
if (MetaData->bRelativeToSection)
{
Model->CurveTransformAttribute = MakeAttributeLambda([this]{ return this->GetCurveTransform(); });
}
Model->SetColor(FLinearColor::White);
Model->SetThickness(2.f);
Model->SetDashLength(5.f);
OutChildCurves.Add(MoveTemp(Model));
}