// Copyright Epic Games, Inc. All Rights Reserved. #include "Compilation/MovieSceneTemplateInterrogation.h" MOVIESCENE_API FMovieSceneAnimTypeID GetInitialValueTypeID(); /** Definition needs to exist after the definition of FMovieSceneBlendingAccumulator */ template void TBlendableTokenStack::ComputeAndActuate(UObject* InObject, FMovieSceneBlendingAccumulator& Accumulator, FMovieSceneBlendingActuatorID InActuatorType, const FMovieSceneContext& Context, FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) { TMovieSceneBlendingActuator* Actuator = Accumulator.FindActuator(InActuatorType); if (!ensure(Actuator)) { return; } TMovieSceneInitialValueStore InitialValues(*Actuator, *this, InObject, &Player); typename TBlendableTokenTraits::WorkingDataType WorkingTotal{}; Tokens.Sort(); for (const TBlendableToken* Token : Tokens) { Token->AddTo(WorkingTotal, InitialValues); } DataType FinalResult = WorkingTotal.Resolve(InitialValues); Actuator->Actuate(InObject, FinalResult, *this, Context, PersistentData, Player); if (Actuator->HasInitialValue(InObject)) { FMovieSceneAnimTypeID TypeID = FMovieSceneAnimTypeID::Combine(Actuator->GetActuatorID(), GetInitialValueTypeID()); if (InObject) { SavePreAnimatedStateForAllEntities(Player, *InObject, TypeID, FMovieSceneRemoveInitialValueTokenProducer(Actuator->AsShared())); } else { SavePreAnimatedStateForAllEntities(Player, TypeID, FMovieSceneRemoveInitialGlobalValueTokenProducer(Actuator->AsShared())); } } } template void TBlendableTokenStack::Interrogate(UObject* AnimatedObject, FMovieSceneInterrogationData& InterrogationData, FMovieSceneBlendingAccumulator& Accumulator, FMovieSceneBlendingActuatorID InActuatorType, const FMovieSceneContext& Context) { TMovieSceneBlendingActuator* Actuator = Accumulator.FindActuator(InActuatorType); if (!ensure(Actuator)) { return; } TMovieSceneInitialValueStore InitialValues(*Actuator, *this, AnimatedObject, nullptr); typename TBlendableTokenTraits::WorkingDataType WorkingTotal{}; for (const TBlendableToken* Token : Tokens) { Token->AddTo(WorkingTotal, InitialValues); } DataType FinalResult = WorkingTotal.Resolve(InitialValues); Actuator->Actuate(InterrogationData, FinalResult, *this, Context); }