2019-12-26 14:45:42 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2018-07-13 06:25:54 -04:00
|
|
|
|
2018-09-25 09:50:03 -04:00
|
|
|
#include "LevelSequenceDirector.h"
|
2022-10-26 12:57:32 -04:00
|
|
|
#include "Engine/Level.h"
|
2018-09-25 09:50:03 -04:00
|
|
|
#include "Engine/World.h"
|
2021-05-27 13:40:37 -04:00
|
|
|
#include "UObject/Stack.h"
|
|
|
|
|
#include "MovieSceneObjectBindingID.h"
|
2021-06-17 13:18:48 -04:00
|
|
|
#include "LevelSequencePlayer.h"
|
2021-05-27 13:40:37 -04:00
|
|
|
#include "IMovieScenePlayer.h"
|
2021-06-17 13:18:48 -04:00
|
|
|
#include "Evaluation/MovieSceneEvaluationTemplateInstance.h"
|
2024-01-23 16:09:37 -05:00
|
|
|
#include "Evaluation/MovieSceneSequenceHierarchy.h"
|
2022-04-22 15:09:25 -04:00
|
|
|
#include "MovieSceneSequence.h"
|
2024-01-23 16:09:37 -05:00
|
|
|
#include "EntitySystem/MovieSceneEntitySystemLinker.h"
|
2022-10-17 11:49:35 -04:00
|
|
|
#include "EntitySystem/MovieSceneSequenceInstance.h"
|
2022-04-22 15:09:25 -04:00
|
|
|
#include "Evaluation/MovieScenePlayback.h"
|
2018-07-13 06:25:54 -04:00
|
|
|
|
2022-09-24 13:57:58 -04:00
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(LevelSequenceDirector)
|
|
|
|
|
|
2018-07-13 06:25:54 -04:00
|
|
|
UWorld* ULevelSequenceDirector::GetWorld() const
|
|
|
|
|
{
|
2018-12-03 09:58:53 -05:00
|
|
|
if (ULevel* OuterLevel = GetTypedOuter<ULevel>())
|
|
|
|
|
{
|
|
|
|
|
return OuterLevel->OwningWorld;
|
|
|
|
|
}
|
2018-07-13 06:25:54 -04:00
|
|
|
return GetTypedOuter<UWorld>();
|
|
|
|
|
}
|
2021-05-27 13:40:37 -04:00
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
const UE::MovieScene::FSequenceInstance* ULevelSequenceDirector::FindSequenceInstance() const
|
|
|
|
|
{
|
|
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
|
|
|
|
if (UMovieSceneEntitySystemLinker* Linker = WeakLinker.Get())
|
|
|
|
|
{
|
|
|
|
|
const FInstanceHandle InstanceHandle(InstanceID, InstanceSerial);
|
|
|
|
|
const FInstanceRegistry* InstanceRegistry = Linker->GetInstanceRegistry();
|
|
|
|
|
if (InstanceRegistry->IsHandleValid(InstanceHandle))
|
|
|
|
|
{
|
|
|
|
|
const FSequenceInstance& Instance = InstanceRegistry->GetInstance(InstanceHandle);
|
|
|
|
|
return &Instance;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
Sequencer: Remove Master from Sequencer
- Remove all instances of Master from the UI - ie. Replace Create Master Sequence with Create Sequence with Shots
- Internally, remove Master - Master Tracks in the MovieScene can just be Tracks
Deprecations (Properties):
- UMovieScene:MasterTracks deprecated for Tracks
- UMovieSceneFolder:ChildMasterTracks deprecated for ChildTracks
- FLevelSequencePlayerSnapshot: MasterName, MasterTime for RootName, RootTime
- UMoviePipelineSetting_BlueprintBase: bIsValidOnMaster for bIsValidOnPrimary
Deprecations (Functions):
- UMovieScene: GetMasterTracks, FindMasterTracksByType, FindMasterTracksByExactType, AddMasterTrack, RemoveMasterTrack deprecated for GetTracks, FindTracksByType, FindTracksByExactType, AddTrack, RemoveTrack
- UMovieSceneFolder: GetChildMasterTracks, AddChildMasterTrack, RemoveChildMasterTrack deprecated for GetChildTracks, AddChildTracks, RemoveChildTrack
- FMovieSceneTrackEditor: FFindOrCreateMasterTrackResult, FindOrCreateMasterTrack deprecated for FindOrCreateRootTrackResult, FindOrCreateRootTrack
- ULevelSequenceDirector: GetMasterSequenceTime deprecated for ULevelSequenceDirector::GetRootSequenceTime
- UDaySequenceDirector: GetMasterSequenceTime deprecated for UDaySequenceDirector::GetRootSequenceTime
- UMoviePipelineSetting: IsValidOnMaster for IsValidOnPrimary
- UMoviePipelineBlueprintLibrary: GetMasterTimecode, GetMasterFrameNumber for GetRootTimecode, GetRootFrameNumber
- UMoviePipeline: GetPipelineMasterConfig for GetPipelinePrimaryConfig
- UMovieSceneAudioTrack: IsAMasterTrack
Classes Renamed:
- FAnimTypePreAnimatedStateMasterStorage for FAnimTypePreAnimatedStateRootStorage
- UMovieSceneMasterInstantiatorSystem for UMovieSceneRootInstantiatorSystem
- ULevelSequenceMasterSequenceSettings to ULevelSequenceSequenceWithShotsSetting
Note, the following instances of master still occur and a "KnownCase" has been added for them in CheckAcceptableWords.cs:
- Deprecated properties (MasterTracks -> Tracks) and functions (ie. GetMasterTracks -> GetTracks)
- masterclip in FCPXML since it's an industry standard term
- masteraudiosubmix in AudioCaptureProtocol
- mastersubmix in MoviePipelineAudioRendering
- masteertimecode, masterframenumber, masterconfig, validonmaster in MovieRenderPipeline
- mastersequencetime, mastertime, mastername in LevelSequence
#jira UE-158660
#preflight 634645e48a0a7b2adc5722e7
#rb matt.hoffman, andrew.rodham
[CL 22739302 by Max Chen in ue5-main branch]
2022-10-24 18:22:10 -04:00
|
|
|
FQualifiedFrameTime ULevelSequenceDirector::GetRootSequenceTime() const
|
2022-04-22 15:09:25 -04:00
|
|
|
{
|
|
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2022-04-22 15:09:25 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
|
|
|
|
UMovieSceneSequence* RootSequence = SharedPlaybackState->GetRootSequence();
|
|
|
|
|
if (RootSequence)
|
2022-04-22 15:09:25 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
const FRootInstanceHandle RootInstanceHandle = Instance->GetRootInstanceHandle();
|
|
|
|
|
const FInstanceRegistry* InstanceRegistry = SharedPlaybackState->GetLinker()->GetInstanceRegistry();
|
|
|
|
|
const FSequenceInstance& RootInstance = InstanceRegistry->GetInstance(RootInstanceHandle);
|
|
|
|
|
|
2022-04-22 15:09:25 -04:00
|
|
|
// Put the qualified frame time into 'display' rate
|
|
|
|
|
FFrameRate DisplayRate = RootSequence->GetMovieScene()->GetDisplayRate();
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneContext Context = RootInstance.GetContext();
|
2022-04-22 15:09:25 -04:00
|
|
|
|
|
|
|
|
FFrameTime DisplayRateTime = ConvertFrameTime(Context.GetTime(), Context.GetFrameRate(), DisplayRate);
|
|
|
|
|
return FQualifiedFrameTime(DisplayRateTime, DisplayRate);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return FQualifiedFrameTime(0, FFrameRate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FQualifiedFrameTime ULevelSequenceDirector::GetCurrentTime() const
|
|
|
|
|
{
|
|
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2022-04-22 15:09:25 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
2024-01-25 14:00:20 -05:00
|
|
|
UMovieSceneSequence* Sequence = SharedPlaybackState->GetRootSequence();
|
|
|
|
|
|
|
|
|
|
const FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
if (ActualSubSequenceID != MovieSceneSequenceID::Root)
|
|
|
|
|
{
|
|
|
|
|
Sequence = SharedPlaybackState->GetHierarchy()->FindSubSequence(ActualSubSequenceID);
|
|
|
|
|
}
|
2022-04-22 15:09:25 -04:00
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
// Put the qualified frame time into 'display' rate
|
2024-01-25 14:00:20 -05:00
|
|
|
FFrameRate DisplayRate = Sequence->GetMovieScene()->GetDisplayRate();
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneContext Context = Instance->GetContext();
|
2022-04-22 15:09:25 -04:00
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
FFrameTime DisplayRateTime = ConvertFrameTime(Context.GetTime(), Context.GetFrameRate(), DisplayRate);
|
|
|
|
|
return FQualifiedFrameTime(DisplayRateTime, DisplayRate);
|
2022-04-22 15:09:25 -04:00
|
|
|
}
|
|
|
|
|
return FQualifiedFrameTime(0, FFrameRate());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-05-27 13:40:37 -04:00
|
|
|
TArray<UObject*> ULevelSequenceDirector::GetBoundObjects(FMovieSceneObjectBindingID ObjectBinding)
|
|
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
2021-05-27 13:40:37 -04:00
|
|
|
TArray<UObject*> Objects;
|
|
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
|
|
|
|
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
|
|
|
|
if (UObject* Object = WeakObject.Get())
|
|
|
|
|
{
|
|
|
|
|
Objects.Add(Object);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FFrame::KismetExecutionMessage(TEXT("No player interface available or assigned."), ELogVerbosity::Error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Objects;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UObject* ULevelSequenceDirector::GetBoundObject(FMovieSceneObjectBindingID ObjectBinding)
|
|
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
|
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
|
|
|
|
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
|
|
|
|
if (UObject* Object = WeakObject.Get())
|
|
|
|
|
{
|
|
|
|
|
return Object;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FFrame::KismetExecutionMessage(TEXT("No player interface available or assigned."), ELogVerbosity::Error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TArray<AActor*> ULevelSequenceDirector::GetBoundActors(FMovieSceneObjectBindingID ObjectBinding)
|
|
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
2021-05-27 13:40:37 -04:00
|
|
|
TArray<AActor*> Actors;
|
|
|
|
|
|
2024-01-23 16:09:37 -05:00
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
|
|
|
|
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
|
|
|
|
if (AActor* Actor = Cast<AActor>(WeakObject.Get()))
|
|
|
|
|
{
|
|
|
|
|
Actors.Add(Actor);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FFrame::KismetExecutionMessage(TEXT("No player interface available or assigned."), ELogVerbosity::Error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Actors;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AActor* ULevelSequenceDirector::GetBoundActor(FMovieSceneObjectBindingID ObjectBinding)
|
|
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
|
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
|
|
|
|
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
|
2021-05-27 13:40:37 -04:00
|
|
|
{
|
|
|
|
|
if (AActor* Actor = Cast<AActor>(WeakObject.Get()))
|
|
|
|
|
{
|
|
|
|
|
return Actor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FFrame::KismetExecutionMessage(TEXT("No player interface available or assigned."), ELogVerbosity::Error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-17 13:18:48 -04:00
|
|
|
UMovieSceneSequence* ULevelSequenceDirector::GetSequence()
|
|
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
using namespace UE::MovieScene;
|
|
|
|
|
|
|
|
|
|
if (const FSequenceInstance* Instance = FindSequenceInstance())
|
2021-06-17 13:18:48 -04:00
|
|
|
{
|
2024-01-23 16:09:37 -05:00
|
|
|
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
|
|
|
|
|
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
|
2024-01-25 14:00:20 -05:00
|
|
|
if (ActualSubSequenceID == MovieSceneSequenceID::Root)
|
|
|
|
|
{
|
|
|
|
|
return SharedPlaybackState->GetRootSequence();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return SharedPlaybackState->GetHierarchy()->FindSubSequence(ActualSubSequenceID);
|
|
|
|
|
}
|
2021-06-17 13:18:48 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
FFrame::KismetExecutionMessage(TEXT("No sequence player."), ELogVerbosity::Error);
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-24 13:57:58 -04:00
|
|
|
|