41 lines
2.1 KiB
C++
41 lines
2.1 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "Evaluation/MovieSceneBaseCacheTemplate.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneBaseCacheTemplate)
|
|
|
|
DECLARE_CYCLE_STAT(TEXT("Chaos Cache Evaluate"), MovieSceneEval_BaseCache_Evaluate, STATGROUP_MovieSceneEval);
|
|
DECLARE_CYCLE_STAT(TEXT("Chaos Cache Token Execute"), MovieSceneEval_BaseCache_TokenExecute, STATGROUP_MovieSceneEval);
|
|
|
|
float FMovieSceneBaseCacheSectionTemplateParameters::MapTimeToAnimation(const FMovieSceneBaseCacheParams& BaseParams, float ComponentDuration, FFrameTime InPosition, FFrameRate InFrameRate) const
|
|
{
|
|
const float SequenceLength = ComponentDuration;
|
|
const FFrameTime AnimationLength = SequenceLength * InFrameRate;
|
|
const int32 LengthInFrames = AnimationLength.FrameNumber.Value + (int)(AnimationLength.GetSubFrame() + 0.5f) + 1;
|
|
|
|
//we only play end if we are not looping, and assuming we are looping if Length is greater than default length;
|
|
const bool bLooping = (SectionEndTime.Value - SectionStartTime.Value + BaseParams.StartFrameOffset + BaseParams.EndFrameOffset) > LengthInFrames;
|
|
|
|
InPosition = FMath::Clamp(InPosition, FFrameTime(SectionStartTime), FFrameTime(SectionEndTime - 1));
|
|
|
|
const float SectionPlayRate = BaseParams.PlayRate;
|
|
const float AnimPlayRate = FMath::IsNearlyZero(SectionPlayRate) ? 1.0f : SectionPlayRate;
|
|
|
|
const float FirstLoopSeqLength = SequenceLength - InFrameRate.AsSeconds(BaseParams.FirstLoopStartFrameOffset + BaseParams.StartFrameOffset + BaseParams.EndFrameOffset);
|
|
const float SeqLength = SequenceLength - InFrameRate.AsSeconds(BaseParams.StartFrameOffset + BaseParams.EndFrameOffset);
|
|
|
|
float AnimPosition = FFrameTime::FromDecimal((InPosition - SectionStartTime).AsDecimal() * AnimPlayRate) / InFrameRate;
|
|
AnimPosition += InFrameRate.AsSeconds(BaseParams.FirstLoopStartFrameOffset);
|
|
if (SeqLength > 0.f && (bLooping || !FMath::IsNearlyEqual(AnimPosition, SeqLength, 1e-4f)))
|
|
{
|
|
AnimPosition = FMath::Fmod(AnimPosition, SeqLength);
|
|
}
|
|
AnimPosition += InFrameRate.AsSeconds(BaseParams.StartFrameOffset);
|
|
if (BaseParams.bReverse)
|
|
{
|
|
AnimPosition = SequenceLength - AnimPosition;
|
|
}
|
|
|
|
return AnimPosition;
|
|
}
|