void UMovieSceneActorReferenceSection::GetKeyHandles(TSet<FKeyHandle>& OutKeyHandles, TRange<float> TimeRange) const { if (!TimeRange.Overlaps(GetRange())) { return; } for ( auto It( ActorGuidIndexCurve.GetKeyHandleIterator() ); It; ++It ) { float Time = ActorGuidIndexCurve.GetKeyTime( It.Key() ); if (TimeRange.Contains(Time)) { OutKeyHandles.Add(It.Key()); } } }
void UMovieSceneComposurePostMoveSettingsSection::GetKeyHandles(TSet<FKeyHandle>& OutKeyHandles, TRange<float> TimeRange) const { if (!TimeRange.Overlaps(GetRange())) { return; } TArray<const FRichCurve*> AllCurves; GetAllCurves(AllCurves); for (const FRichCurve* Curve : AllCurves) { for (auto It(Curve->GetKeyHandleIterator()); It; ++It) { float Time = Curve->GetKeyTime(It.Key()); if (TimeRange.Contains(Time)) { OutKeyHandles.Add(It.Key()); } } } }
void FMovieSceneSpawnTrackInstance::Update(EMovieSceneUpdateData& UpdateData, const TArray<TWeakObjectPtr<UObject>>& RuntimeObjects, IMovieScenePlayer& Player, FMovieSceneSequenceInstance& SequenceInstance) { IMovieSceneSpawnRegister& SpawnRegister = Player.GetSpawnRegister(); FMovieSceneSpawnable* Spawnable = SequenceInstance.GetSequence()->GetMovieScene()->FindSpawnable(Track->GetObjectId()); TRange<float> Range = SequenceInstance.GetTimeRange(); const bool bIsPreview = Player.IsPreview(); // If we're evaluating outside of the instance's time range, and the sequence owns the spawnable, there's no reason to evaluate - it should already be destroyed if (Spawnable && Spawnable->GetSpawnOwnership() == ESpawnOwnership::InnerSequence && !Range.Contains(UpdateData.Position)) { bool bDestroy = true; #if WITH_EDITORONLY_DATA bDestroy = !Spawnable->ShouldIgnoreOwnershipInEditor(); // Don't destroy cameras while previewing if (bIsPreview && MovieSceneHelpers::CameraComponentFromActor(Cast<AActor>(Spawnable->GetObjectTemplate()))) { bDestroy = false; } #endif if (bDestroy) { SpawnRegister.DestroySpawnedObject(Track->GetObjectId(), SequenceInstance, Player); return; } } bool bIsSpawned = false; if (Track->Eval(UpdateData.Position, UpdateData.LastPosition, bIsSpawned)) { // Spawn the object if needed if (bIsSpawned && RuntimeObjects.Num() == 0) { SpawnRegister.SpawnObject(Track->GetObjectId(), SequenceInstance, Player); } // Destroy the object if needed if (!bIsSpawned && RuntimeObjects.Num() != 0) { SpawnRegister.DestroySpawnedObject(Track->GetObjectId(), SequenceInstance, Player); } } }