// 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& WithinRange, TArray* OutKeyTimes, TArray* OutKeyHandles) { GetData().GetKeys(WithinRange, OutKeyTimes, OutKeyHandles); } void FMovieSceneAudioTriggerChannel::GetKeyTimes(TArrayView InHandles, TArrayView OutKeyTimes) { GetData().GetKeyTimes(InHandles, OutKeyTimes); } void FMovieSceneAudioTriggerChannel::SetKeyTimes(TArrayView InHandles, TArrayView InKeyTimes) { GetData().SetKeyTimes(InHandles, InKeyTimes); } void FMovieSceneAudioTriggerChannel::DuplicateKeys(TArrayView InHandles, TArrayView OutNewHandles) { GetData().DuplicateKeys(InHandles, OutNewHandles); } void FMovieSceneAudioTriggerChannel::DeleteKeys(TArrayView 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 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); }