// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Cache/MovieSceneCachedCurve.h" #include "Cache/MovieSceneCurveCachePool.h" #include "Cache/MovieSceneUpdateCachedCurveData.h" #include "Channels/BezierChannelCurveModel.h" #include "Channels/DoubleChannelCurveModel.h" #include "Channels/FloatChannelCurveModel.h" #include "CurveEditorCurveDrawParamsHandle.h" #include "InvertedCurveModel.h" #include "MovieScene.h" namespace UE::MovieSceneTools { template class TInvertedBezierChannelCurveModel : public UE::CurveEditor::TInvertedCurveModel { public: template explicit TInvertedBezierChannelCurveModel(TArg&&... Arg) : UE::CurveEditor::TInvertedCurveModel(Forward(Arg)...) {} virtual UE::CurveEditor::ICurveEditorCurveCachePool* DrawCurveToCachePool(const TSharedRef& CurveEditor, const UE::CurveEditor::FCurveDrawParamsHandle& CurveDrawParamsHandle, const FCurveEditorScreenSpace& ScreenSpace) override { using ChannelType = std::remove_pointer_tGetChannelHandle().Get())>; ChannelType* Channel = this->GetChannelHandle().Get(); UMovieSceneSection* Section = this->template GetOwningObjectOrOuter(); if (!this->CachedCurve.IsValid()) { this->CachedCurve = MakeShared>(CurveDrawParamsHandle.GetID()); this->CachedCurve->Initialize(CurveEditor); } if (Channel && Section && Section->GetTypedOuter()) { const FMovieSceneChannelMetaData* MetaData = this->GetChannelHandle().GetMetaData(); const bool bInvertInterpolatingPointsY = MetaData ? MetaData->bInvertValue : false; const FFrameRate TickResolution = Section->GetTypedOuter()->GetTickResolution(); UE::MovieSceneTools::FMovieSceneUpdateCachedCurveData UpdateData( *CurveEditor, *this, *Channel, ScreenSpace, TickResolution, bInvertInterpolatingPointsY); this->CachedCurve->UpdateCachedCurve(UpdateData, CurveDrawParamsHandle); } return &UE::MovieSceneTools::FMovieSceneCurveCachePool::Get(); } }; }