bool F3DAttachTrackEditor::AddKeyInternal( float KeyTime, const TArray<TWeakObjectPtr<UObject>> Objects, const FName SocketName, const FName ComponentName, AActor* ParentActor) { bool bHandleCreated = false; bool bTrackCreated = false; bool bTrackModified = false; FGuid ParentActorId; if (ParentActor != nullptr) { FFindOrCreateHandleResult HandleResult = FindOrCreateHandleToObject(ParentActor); ParentActorId = HandleResult.Handle; bHandleCreated |= HandleResult.bWasCreated; } if (!ParentActorId.IsValid()) { return false; } for( int32 ObjectIndex = 0; ObjectIndex < Objects.Num(); ++ObjectIndex ) { UObject* Object = Objects[ObjectIndex].Get(); FFindOrCreateHandleResult HandleResult = FindOrCreateHandleToObject( Object ); FGuid ObjectHandle = HandleResult.Handle; bHandleCreated |= HandleResult.bWasCreated; if (ObjectHandle.IsValid()) { FFindOrCreateTrackResult TrackResult = FindOrCreateTrackForObject( ObjectHandle, UMovieScene3DAttachTrack::StaticClass()); UMovieSceneTrack* Track = TrackResult.Track; bTrackCreated |= TrackResult.bWasCreated; if (ensure(Track)) { // Clamp to next attach section's start time or the end of the current sequencer view range float AttachEndTime = GetSequencer()->GetViewRange().GetUpperBoundValue(); for (int32 AttachSectionIndex = 0; AttachSectionIndex < Track->GetAllSections().Num(); ++AttachSectionIndex) { float StartTime = Track->GetAllSections()[AttachSectionIndex]->GetStartTime(); float EndTime = Track->GetAllSections()[AttachSectionIndex]->GetEndTime(); if (KeyTime < StartTime) { if (AttachEndTime > StartTime) { AttachEndTime = StartTime; } } } Cast<UMovieScene3DAttachTrack>(Track)->AddConstraint( KeyTime, AttachEndTime, SocketName, ComponentName, ParentActorId ); bTrackModified = true; } } } return bHandleCreated || bTrackCreated || bTrackModified; }
void FSequencerDragOperation::GetSectionSnapTimes(TArray<float>& OutSnapTimes, UMovieSceneSection* Section, TSharedPtr<FTrackNode> SequencerNode, bool bIgnoreOurSectionCustomSnaps) { // @todo Sequencer handle dilation snapping better // Collect all the potential snap times from other section borders const TArray< TSharedRef<ISequencerSection> >& Sections = SequencerNode->GetSections(); for (int32 SectionIndex = 0; SectionIndex < Sections.Num(); ++SectionIndex) { const UMovieSceneSection* InSection = Sections[SectionIndex]->GetSectionObject(); bool bIsThisSection = Section == InSection; if (!bIgnoreOurSectionCustomSnaps || !bIsThisSection) { InSection->GetSnapTimes(OutSnapTimes, Section != InSection); } } // snap to director track if it exists, and we are not the director track UMovieSceneTrack* OuterTrack = Cast<UMovieSceneTrack>(Section->GetOuter()); UMovieScene* MovieScene = Cast<UMovieScene>(OuterTrack->GetOuter()); UMovieSceneTrack* ShotTrack = MovieScene->FindMasterTrack(UMovieSceneShotTrack::StaticClass()); if (ShotTrack && OuterTrack != ShotTrack) { const TArray<UMovieSceneSection*>& ShotSections = ShotTrack->GetAllSections(); for (int32 SectionIndex = 0; SectionIndex < ShotSections.Num(); ++SectionIndex) { auto Shot = ShotSections[SectionIndex]; Shot->GetSnapTimes(OutSnapTimes, true); } } }
void FSequencerNodeTree::MakeSectionInterfaces( UMovieSceneTrack& Track, TSharedRef<FTrackNode>& SectionAreaNode ) { const TArray<UMovieSceneSection*>& MovieSceneSections = Track.GetAllSections(); TSharedRef<FMovieSceneTrackEditor> Editor = FindOrAddTypeEditor( Track ); for (int32 SectionIndex = 0; SectionIndex < MovieSceneSections.Num(); ++SectionIndex ) { UMovieSceneSection* SectionObject = MovieSceneSections[SectionIndex]; TSharedRef<ISequencerSection> Section = Editor->MakeSectionInterface( *SectionObject, &Track ); // Ask the section to generate it's inner layout FSectionLayoutBuilder Builder( SectionAreaNode ); Section->GenerateSectionLayout( Builder ); SectionAreaNode->AddSection( Section ); } SectionAreaNode->FixRowIndices(); }