// Copyright Epic Games, Inc. All Rights Reserved. #include "MovieSceneObjectBindingID.h" #include "Evaluation/MovieSceneRootOverridePath.h" #include "Evaluation/MovieSceneSequenceHierarchy.h" #include "Compilation/MovieSceneCompiledDataManager.h" #include "EntitySystem/MovieSceneSequenceInstance.h" #include "EntitySystem/MovieSceneSharedPlaybackState.h" #include "IMovieScenePlayer.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneObjectBindingID) namespace UE { namespace MovieScene { FMovieSceneSequenceID ResolveExternalSequenceID(FMovieSceneSequenceID SourceSequenceID, int32 RemapSourceParentIndex, FMovieSceneSequenceID TargetSequenceID, TSharedRef SharedPlaybackState) { ensureMsgf(RemapSourceParentIndex >= 0, TEXT("Invalid parent index specified")); if (SourceSequenceID == MovieSceneSequenceID::Root) { return TargetSequenceID; } const FMovieSceneSequenceHierarchy* Hierarchy = SharedPlaybackState->GetHierarchy(); if (!ensureMsgf(Hierarchy, TEXT("Sequence being evaluated as a sub sequence without any hierarchy. This indicates a bug with either the player or the compiled data."))) { return TargetSequenceID; } using namespace UE::MovieScene; FSubSequencePath PathFromSource(SourceSequenceID, Hierarchy); PathFromSource.PopGenerations(RemapSourceParentIndex); return PathFromSource.ResolveChildSequenceID(TargetSequenceID); } FMovieSceneSequenceID ResolveExternalSequenceID(FMovieSceneSequenceID SourceSequenceID, int32 RemapSourceParentIndex, FMovieSceneSequenceID TargetSequenceID, const FMovieSceneSequenceHierarchy* Hierarchy) { ensureMsgf(RemapSourceParentIndex >= 0, TEXT("Invalid parent index specified")); if (SourceSequenceID == MovieSceneSequenceID::Root) { return TargetSequenceID; } if (!ensureMsgf(Hierarchy, TEXT("Sequence being evaluated as a sub sequence without any hierarchy. This indicates a bug with either the player or the compiled data."))) { return TargetSequenceID; } using namespace UE::MovieScene; FSubSequencePath PathFromSource(SourceSequenceID, Hierarchy); PathFromSource.PopGenerations(RemapSourceParentIndex); return PathFromSource.ResolveChildSequenceID(TargetSequenceID); } FRelativeObjectBindingID::FRelativeObjectBindingID(FMovieSceneSequenceID SourceSequenceID, FMovieSceneSequenceID TargetSequenceID, const FGuid& TargetGuid, UMovieSceneSequence* RootSequence) { UMovieSceneCompiledDataManager* CompiledDataManager = UMovieSceneCompiledDataManager::GetPrecompiledData(); FMovieSceneSequenceHierarchy TempHierarchy; UMovieSceneCompiledDataManager::CompileHierarchy(RootSequence, &TempHierarchy, EMovieSceneServerClientMask::All); ConstructInternal(SourceSequenceID, TargetSequenceID, TargetGuid, &TempHierarchy); } FRelativeObjectBindingID::FRelativeObjectBindingID(FMovieSceneSequenceID SourceSequenceID, FMovieSceneSequenceID TargetSequenceID, const FGuid& TargetGuid, IMovieScenePlayer& Player) { ConstructInternal(SourceSequenceID, TargetSequenceID, TargetGuid, Player.GetSharedPlaybackState()->GetHierarchy()); } FRelativeObjectBindingID::FRelativeObjectBindingID(FMovieSceneSequenceID SourceSequenceID, FMovieSceneSequenceID TargetSequenceID, const FGuid& TargetGuid, TSharedRef SharedPlaybackState) { ConstructInternal(SourceSequenceID, TargetSequenceID, TargetGuid, SharedPlaybackState->GetHierarchy()); } FRelativeObjectBindingID::FRelativeObjectBindingID(FMovieSceneSequenceID SourceSequenceID, FMovieSceneSequenceID TargetSequenceID, const FGuid& TargetGuid, const FMovieSceneSequenceHierarchy* Hierarchy) { ConstructInternal(SourceSequenceID, TargetSequenceID, TargetGuid, Hierarchy); } void FRelativeObjectBindingID::ConstructInternal(FMovieSceneSequenceID SourceSequenceID, FMovieSceneSequenceID TargetSequenceID, const FGuid& TargetGuid, const FMovieSceneSequenceHierarchy* Hierarchy) { FSubSequencePath PathFromOwner(SourceSequenceID, Hierarchy); FSubSequencePath PathFromTarget(TargetSequenceID, Hierarchy); FMovieSceneSequenceID CommonParent = FSubSequencePath::FindCommonParent(PathFromOwner, PathFromTarget); Guid = TargetGuid; SequenceID = PathFromTarget.MakeLocalSequenceID(CommonParent); ResolveParentIndex = PathFromOwner.NumGenerationsFromLeaf(CommonParent); } FRelativeObjectBindingID FFixedObjectBindingID::ConvertToRelative(FMovieSceneSequenceID SourceSequenceID, IMovieScenePlayer& InPlayer) const { return ConvertToRelative(SourceSequenceID, InPlayer.GetSharedPlaybackState()); } FRelativeObjectBindingID FFixedObjectBindingID::ConvertToRelative(FMovieSceneSequenceID SourceSequenceID, TSharedRef SharedPlaybackState) const { return FRelativeObjectBindingID(SourceSequenceID, SequenceID, Guid, SharedPlaybackState); } FRelativeObjectBindingID FFixedObjectBindingID::ConvertToRelative(FMovieSceneSequenceID SourceSequenceID, const FMovieSceneSequenceHierarchy* Hierarchy) const { return FRelativeObjectBindingID(SourceSequenceID, SequenceID, Guid, Hierarchy); } } // namespace MovieScene } // namespace UE #if WITH_EDITORONLY_DATA void FMovieSceneObjectBindingID::PostSerialize(const FArchive& Ar) { if (Space_DEPRECATED != EMovieSceneObjectBindingSpace::Unused) { ResolveParentIndex = (Space_DEPRECATED == EMovieSceneObjectBindingSpace::Local) ? 0 : FixedRootSequenceParentIndex; Space_DEPRECATED = EMovieSceneObjectBindingSpace::Unused; } } #endif // WITH_EDITORONLY_DATA FMovieSceneSequenceID FMovieSceneObjectBindingID::ResolveSequenceID(FMovieSceneSequenceID LocalSequenceID, IMovieScenePlayer& Player) const { return ResolveSequenceID(LocalSequenceID, Player.GetSharedPlaybackState()); } FMovieSceneSequenceID FMovieSceneObjectBindingID::ResolveSequenceID(FMovieSceneSequenceID LocalSequenceID, TSharedRef SharedPlaybackState) const { FMovieSceneSequenceID TargetSequenceID = FMovieSceneSequenceID(SequenceID); if (ResolveParentIndex == FixedRootSequenceParentIndex) { return TargetSequenceID; } return UE::MovieScene::ResolveExternalSequenceID(LocalSequenceID, ResolveParentIndex, TargetSequenceID, SharedPlaybackState); } FMovieSceneSequenceID FMovieSceneObjectBindingID::ResolveSequenceID(FMovieSceneSequenceID LocalSequenceID, const FMovieSceneSequenceHierarchy* Hierarchy) const { FMovieSceneSequenceID TargetSequenceID = FMovieSceneSequenceID(SequenceID); if (ResolveParentIndex == FixedRootSequenceParentIndex) { return TargetSequenceID; } return UE::MovieScene::ResolveExternalSequenceID(LocalSequenceID, ResolveParentIndex, TargetSequenceID, Hierarchy); } UE::MovieScene::FFixedObjectBindingID FMovieSceneObjectBindingID::ResolveToFixed(FMovieSceneSequenceID RuntimeSequenceID, IMovieScenePlayer& Player) const { return ResolveToFixed(RuntimeSequenceID, Player.GetSharedPlaybackState()); } UE::MovieScene::FFixedObjectBindingID FMovieSceneObjectBindingID::ResolveToFixed(FMovieSceneSequenceID RuntimeSequenceID, TSharedRef SharedPlaybackState) const { FMovieSceneSequenceID ThisSequenceID = FMovieSceneSequenceID(SequenceID); if (ResolveParentIndex == FixedRootSequenceParentIndex) { return UE::MovieScene::FFixedObjectBindingID(Guid, ThisSequenceID); } else if (ensure(RuntimeSequenceID != MovieSceneSequenceID::Invalid)) { ThisSequenceID = UE::MovieScene::ResolveExternalSequenceID(RuntimeSequenceID, ResolveParentIndex, ThisSequenceID, SharedPlaybackState); return UE::MovieScene::FFixedObjectBindingID(Guid, ThisSequenceID); } return UE::MovieScene::FFixedObjectBindingID(Guid, MovieSceneSequenceID::Invalid); } TArrayView> FMovieSceneObjectBindingID::ResolveBoundObjects(FMovieSceneSequenceID LocalSequenceID, IMovieScenePlayer& Player) const { return ResolveBoundObjects(LocalSequenceID, Player.GetSharedPlaybackState()); } TArrayView> FMovieSceneObjectBindingID::ResolveBoundObjects(FMovieSceneSequenceID LocalSequenceID, TSharedRef SharedPlaybackState) const { if (IsValid()) { if (FMovieSceneEvaluationState* State = SharedPlaybackState->FindCapability()) { FMovieSceneSequenceID ResolvedSequenceID = ResolveSequenceID(LocalSequenceID, SharedPlaybackState); return State->FindBoundObjects(Guid, ResolvedSequenceID, SharedPlaybackState); } } return TArrayView>(); } TArrayView> FMovieSceneObjectBindingID::ResolveBoundObjects(const UE::MovieScene::FSequenceInstance& SequenceInstance) const { if (IsValid()) { return ResolveBoundObjects(SequenceInstance.GetSequenceID(), SequenceInstance.GetSharedPlaybackState()); } return TArrayView>(); }