Files
UnrealEngine/Engine/Source/Runtime/MovieSceneTracks/Private/Evaluation/MovieSceneBaseCacheTemplate.cpp
2025-05-18 13:04:45 +08:00

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;
}