// Copyright Epic Games, Inc. All Rights Reserved. #include "Sections/MovieSceneActorReferenceSection.h" #include "Channels/MovieSceneChannelProxy.h" #include "MovieSceneObjectBindingID.h" #include "MovieSceneSequenceID.h" #include "Evaluation/MovieSceneSequenceHierarchy.h" #include "IMovieScenePlayer.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneActorReferenceSection) bool FMovieSceneActorReferenceData::Evaluate(FFrameTime InTime, FMovieSceneActorReferenceKey& OutValue) const { if (KeyTimes.Num()) { const int32 Index = FMath::Max(0, Algo::UpperBound(KeyTimes, InTime.FrameNumber)-1); OutValue = KeyValues[Index]; return true; } OutValue = DefaultValue; return true; } void FMovieSceneActorReferenceData::GetKeys(const TRange& WithinRange, TArray* OutKeyTimes, TArray* OutKeyHandles) { GetData().GetKeys(WithinRange, OutKeyTimes, OutKeyHandles); } void FMovieSceneActorReferenceData::GetKeyTimes(TArrayView InHandles, TArrayView OutKeyTimes) { GetData().GetKeyTimes(InHandles, OutKeyTimes); } void FMovieSceneActorReferenceData::SetKeyTimes(TArrayView InHandles, TArrayView InKeyTimes) { GetData().SetKeyTimes(InHandles, InKeyTimes); } void FMovieSceneActorReferenceData::DuplicateKeys(TArrayView InHandles, TArrayView OutNewHandles) { GetData().DuplicateKeys(InHandles, OutNewHandles); } void FMovieSceneActorReferenceData::DeleteKeys(TArrayView InHandles) { GetData().DeleteKeys(InHandles); } void FMovieSceneActorReferenceData::DeleteKeysFrom(FFrameNumber InTime, bool bDeleteKeysBefore) { // Insert a key at the current time to maintain evaluation if (GetData().GetTimes().Num() > 0) { FMovieSceneActorReferenceKey Value; Evaluate(InTime, Value); GetData().UpdateOrAddKey(InTime, Value); } GetData().DeleteKeysFrom(InTime, bDeleteKeysBefore); } FKeyHandle FMovieSceneActorReferenceData::GetHandle(int32 Index) { return GetData().GetHandle(Index); } int32 FMovieSceneActorReferenceData::GetIndex(FKeyHandle Handle) { return GetData().GetIndex(Handle); } void FMovieSceneActorReferenceData::RemapTimes(const UE::MovieScene::IRetimingInterface& Retimer) { GetData().RemapTimes(Retimer); } TRange FMovieSceneActorReferenceData::ComputeEffectiveRange() const { return GetData().GetTotalRange(); } int32 FMovieSceneActorReferenceData::GetNumKeys() const { return KeyTimes.Num(); } void FMovieSceneActorReferenceData::Reset() { KeyTimes.Reset(); KeyValues.Reset(); KeyHandles.Reset(); DefaultValue = FMovieSceneActorReferenceKey(); } void FMovieSceneActorReferenceData::Offset(FFrameNumber DeltaPosition) { GetData().Offset(DeltaPosition); } void FMovieSceneActorReferenceData::ClearDefault() { DefaultValue = FMovieSceneActorReferenceKey(); } UMovieSceneActorReferenceSection::UMovieSceneActorReferenceSection( const FObjectInitializer& ObjectInitializer ) : Super( ObjectInitializer ) { #if WITH_EDITOR ChannelProxy = MakeShared(ActorReferenceData, FMovieSceneChannelMetaData()); #else ChannelProxy = MakeShared(ActorReferenceData); #endif } void UMovieSceneActorReferenceSection::PostLoad() { Super::PostLoad(); if (ActorGuidStrings_DEPRECATED.Num()) { TArray Guids; for (const FString& ActorGuidString : ActorGuidStrings_DEPRECATED) { FGuid& ActorGuid = Guids[Guids.Emplace()]; FGuid::Parse( ActorGuidString, ActorGuid); } if (Guids.IsValidIndex(ActorGuidIndexCurve_DEPRECATED.GetDefaultValue())) { FMovieSceneObjectBindingID DefaultValue = UE::MovieScene::FRelativeObjectBindingID(Guids[ActorGuidIndexCurve_DEPRECATED.GetDefaultValue()]); ActorReferenceData.SetDefault(DefaultValue); } for (auto It = ActorGuidIndexCurve_DEPRECATED.GetKeyIterator(); It; ++It) { if (ensure(Guids.IsValidIndex(It->Value))) { FMovieSceneObjectBindingID BindingID = UE::MovieScene::FRelativeObjectBindingID(Guids[It->Value]); ActorReferenceData.UpgradeLegacyTime(this, It->Time, BindingID); } } } } void UMovieSceneActorReferenceSection::OnBindingIDsUpdated(const TMap& OldFixedToNewFixedMap, FMovieSceneSequenceID LocalSequenceID, TSharedRef SharedPlaybackState) { UE::MovieScene::FFixedObjectBindingID DefaultFixedBindingID = ActorReferenceData.GetDefault().Object.ResolveToFixed(LocalSequenceID, SharedPlaybackState); if (OldFixedToNewFixedMap.Contains(DefaultFixedBindingID)) { Modify(); const FMovieSceneSequenceHierarchy* Hierarchy = SharedPlaybackState->GetHierarchy(); FMovieSceneActorReferenceKey NewDefaultValue = ActorReferenceData.GetDefault(); NewDefaultValue.Object = OldFixedToNewFixedMap[DefaultFixedBindingID].ConvertToRelative(LocalSequenceID, Hierarchy); ActorReferenceData.SetDefault(NewDefaultValue); } for (FMovieSceneActorReferenceKey& Key : ActorReferenceData.GetData().GetValues()) { UE::MovieScene::FFixedObjectBindingID KeyFixedBindingID = Key.Object.ResolveToFixed(LocalSequenceID, SharedPlaybackState); if (OldFixedToNewFixedMap.Contains(KeyFixedBindingID)) { Modify(); const FMovieSceneSequenceHierarchy* Hierarchy = SharedPlaybackState->GetHierarchy(); Key.Object = OldFixedToNewFixedMap[KeyFixedBindingID].ConvertToRelative(LocalSequenceID, Hierarchy); } } }