Files
UnrealEngineUWP/Engine/Source/Runtime/LevelSequence/Private/LevelSequenceDirector.cpp

222 lines
6.8 KiB
C++
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LevelSequenceDirector.h"
#include "Engine/Level.h"
#include "Engine/World.h"
#include "UObject/Stack.h"
#include "MovieSceneObjectBindingID.h"
#include "LevelSequencePlayer.h"
#include "IMovieScenePlayer.h"
#include "Evaluation/MovieSceneEvaluationTemplateInstance.h"
#include "Evaluation/MovieSceneSequenceHierarchy.h"
#include "MovieSceneSequence.h"
#include "EntitySystem/MovieSceneEntitySystemLinker.h"
#include "EntitySystem/MovieSceneSequenceInstance.h"
#include "Evaluation/MovieScenePlayback.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(LevelSequenceDirector)
UWorld* ULevelSequenceDirector::GetWorld() const
{
if (ULevel* OuterLevel = GetTypedOuter<ULevel>())
{
return OuterLevel->OwningWorld;
}
return GetTypedOuter<UWorld>();
}
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
{
using namespace UE::MovieScene;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
UMovieSceneSequence* RootSequence = SharedPlaybackState->GetRootSequence();
if (RootSequence)
{
const FRootInstanceHandle RootInstanceHandle = Instance->GetRootInstanceHandle();
const FInstanceRegistry* InstanceRegistry = SharedPlaybackState->GetLinker()->GetInstanceRegistry();
const FSequenceInstance& RootInstance = InstanceRegistry->GetInstance(RootInstanceHandle);
// Put the qualified frame time into 'display' rate
FFrameRate DisplayRate = RootSequence->GetMovieScene()->GetDisplayRate();
FMovieSceneContext Context = RootInstance.GetContext();
FFrameTime DisplayRateTime = ConvertFrameTime(Context.GetTime(), Context.GetFrameRate(), DisplayRate);
return FQualifiedFrameTime(DisplayRateTime, DisplayRate);
}
}
return FQualifiedFrameTime(0, FFrameRate());
}
FQualifiedFrameTime ULevelSequenceDirector::GetCurrentTime() const
{
using namespace UE::MovieScene;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
UMovieSceneSequence* Sequence = SharedPlaybackState->GetRootSequence();
const FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
if (ActualSubSequenceID != MovieSceneSequenceID::Root)
{
Sequence = SharedPlaybackState->GetHierarchy()->FindSubSequence(ActualSubSequenceID);
}
// Put the qualified frame time into 'display' rate
FFrameRate DisplayRate = Sequence->GetMovieScene()->GetDisplayRate();
FMovieSceneContext Context = Instance->GetContext();
FFrameTime DisplayRateTime = ConvertFrameTime(Context.GetTime(), Context.GetFrameRate(), DisplayRate);
return FQualifiedFrameTime(DisplayRateTime, DisplayRate);
}
return FQualifiedFrameTime(0, FFrameRate());
}
TArray<UObject*> ULevelSequenceDirector::GetBoundObjects(FMovieSceneObjectBindingID ObjectBinding)
{
using namespace UE::MovieScene;
TArray<UObject*> Objects;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
{
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)
{
using namespace UE::MovieScene;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
{
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)
{
using namespace UE::MovieScene;
TArray<AActor*> Actors;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
{
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)
{
using namespace UE::MovieScene;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
for (TWeakObjectPtr<> WeakObject : ObjectBinding.ResolveBoundObjects(ActualSubSequenceID, SharedPlaybackState.ToSharedRef()))
{
if (AActor* Actor = Cast<AActor>(WeakObject.Get()))
{
return Actor;
}
}
}
else
{
FFrame::KismetExecutionMessage(TEXT("No player interface available or assigned."), ELogVerbosity::Error);
}
return nullptr;
}
UMovieSceneSequence* ULevelSequenceDirector::GetSequence()
{
using namespace UE::MovieScene;
if (const FSequenceInstance* Instance = FindSequenceInstance())
{
FMovieSceneSequenceID ActualSubSequenceID(SubSequenceID);
TSharedPtr<const FSharedPlaybackState> SharedPlaybackState = Instance->GetSharedPlaybackState();
if (ActualSubSequenceID == MovieSceneSequenceID::Root)
{
return SharedPlaybackState->GetRootSequence();
}
else
{
return SharedPlaybackState->GetHierarchy()->FindSubSequence(ActualSubSequenceID);
}
}
else
{
FFrame::KismetExecutionMessage(TEXT("No sequence player."), ELogVerbosity::Error);
return nullptr;
}
}