Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Private/Channels/MovieSceneAudioTriggerChannel.cpp
2025-05-18 13:04:45 +08:00

114 lines
3.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Channels/MovieSceneAudioTriggerChannel.h"
#include "Channels/MovieSceneChannelProxy.h"
#include "Curves/IntegralCurve.h"
#include "Misc/FrameRate.h"
#include "MovieSceneFwd.h"
#include "MovieSceneFrameMigration.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneAudioTriggerChannel)
bool FMovieSceneAudioTriggerChannel::EvaluatePossibleTriggers(const FMovieSceneContext& InContext, FMoveSceneAudioTriggerState& InState, bool& OutTriggered) const
{
FFrameTime CurrentTime = InContext.GetTime();
if (Times.Num())
{
bool bHasGoneBackwards = InState.PreviousUpdateTime.IsSet() && *InState.PreviousUpdateTime > CurrentTime;
// If we've somehow gone backwards, reset out state.
if (bHasGoneBackwards || InContext.GetDirection() == EPlayDirection::Backwards)
{
InState.PreviousIndex.Reset();
InState.PreviousUpdateTime.Reset();
}
if (InContext.GetDirection() == EPlayDirection::Forwards)
{
const int32 Index = FMath::Max(0, Algo::UpperBound(Times, CurrentTime.FrameNumber) - 1);
if (Times.IsValidIndex(Index) && CurrentTime.FrameNumber > Times[Index] )
{
bool bNewIndex = InState.PreviousIndex.IsSet() ? Index > *InState.PreviousIndex : true;
OutTriggered = bNewIndex;
InState.PreviousIndex = Index;
InState.PreviousUpdateTime = CurrentTime;
return true;
}
}
}
return false;
}
void FMovieSceneAudioTriggerChannel::GetKeys(const TRange<FFrameNumber>& WithinRange, TArray<FFrameNumber>* OutKeyTimes, TArray<FKeyHandle>* OutKeyHandles)
{
GetData().GetKeys(WithinRange, OutKeyTimes, OutKeyHandles);
}
void FMovieSceneAudioTriggerChannel::GetKeyTimes(TArrayView<const FKeyHandle> InHandles, TArrayView<FFrameNumber> OutKeyTimes)
{
GetData().GetKeyTimes(InHandles, OutKeyTimes);
}
void FMovieSceneAudioTriggerChannel::SetKeyTimes(TArrayView<const FKeyHandle> InHandles, TArrayView<const FFrameNumber> InKeyTimes)
{
GetData().SetKeyTimes(InHandles, InKeyTimes);
}
void FMovieSceneAudioTriggerChannel::DuplicateKeys(TArrayView<const FKeyHandle> InHandles, TArrayView<FKeyHandle> OutNewHandles)
{
GetData().DuplicateKeys(InHandles, OutNewHandles);
}
void FMovieSceneAudioTriggerChannel::DeleteKeys(TArrayView<const FKeyHandle> InHandles)
{
GetData().DeleteKeys(InHandles);
}
void FMovieSceneAudioTriggerChannel::DeleteKeysFrom(FFrameNumber InTime, bool bDeleteKeysBefore)
{
GetData().DeleteKeysFrom(InTime, bDeleteKeysBefore);
}
void FMovieSceneAudioTriggerChannel::RemapTimes(const UE::MovieScene::IRetimingInterface& Retimer)
{
GetData().RemapTimes(Retimer);
}
TRange<FFrameNumber> FMovieSceneAudioTriggerChannel::ComputeEffectiveRange() const
{
return GetData().GetTotalRange();
}
int32 FMovieSceneAudioTriggerChannel::GetNumKeys() const
{
return Times.Num();
}
void FMovieSceneAudioTriggerChannel::Reset()
{
Times.Reset();
Values.Reset();
KeyHandles.Reset();
}
void FMovieSceneAudioTriggerChannel::Optimize(const FKeyDataOptimizationParams& InParameters)
{
UE::MovieScene::Optimize(this, InParameters);
}
FKeyHandle FMovieSceneAudioTriggerChannel::GetHandle(int32 Index)
{
return GetData().GetHandle(Index);
}
int32 FMovieSceneAudioTriggerChannel::GetIndex(FKeyHandle Handle)
{
return GetData().GetIndex(Handle);
}
void FMovieSceneAudioTriggerChannel::Offset(FFrameNumber DeltaPosition)
{
GetData().Offset(DeltaPosition);
}