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; }
FKeyPropertyResult FFaceFXAnimationTrackEditor::AddFaceFXSection(FFrameNumber KeyTime, UObject* Object, FFaceFXAnimComponentSet AnimCompSet) { FKeyPropertyResult result; bool bHandleCreated = false; bool bTrackCreated = false; bool bTrackModified = false; FFindOrCreateHandleResult HandleResult = FindOrCreateHandleToObject(Object); FGuid ObjectHandle = HandleResult.Handle; result.bHandleCreated |= HandleResult.bWasCreated; if (ObjectHandle.IsValid()) { FFindOrCreateTrackResult TrackResult = FindOrCreateTrackForObject(ObjectHandle, UFaceFXAnimationTrack::StaticClass()); UMovieSceneTrack* Track = TrackResult.Track; result.bTrackCreated |= TrackResult.bWasCreated; if (UFaceFXAnimationTrack* AnimTrack = Cast<UFaceFXAnimationTrack>(Track)) { AnimTrack->AddSection(KeyTime, AnimCompSet); result.bTrackModified = true; } } return result; }
void FMarginTrackEditor::OnKeyMargin( float KeyTime, const FPropertyChangedParams* PropertyChangedParams ) { FMargin MarginValue = *PropertyChangedParams->GetPropertyValue<FMargin>(); FName PropertyName = PropertyChangedParams->PropertyPath.Last()->GetFName(); for( int32 ObjectIndex = 0; ObjectIndex < PropertyChangedParams->ObjectsThatChanged.Num(); ++ObjectIndex ) { UObject* Object = PropertyChangedParams->ObjectsThatChanged[ObjectIndex]; FMarginKey Key; Key.bAddKeyEvenIfUnchanged = !PropertyChangedParams->bRequireAutoKey; Key.CurveName = PropertyChangedParams->StructPropertyNameToKey; Key.Value = MarginValue; FGuid ObjectHandle = FindOrCreateHandleToObject( Object ); if (ObjectHandle.IsValid()) { UMovieSceneTrack* Track = GetTrackForObject( ObjectHandle, UMovieSceneMarginTrack::StaticClass(), PropertyName ); if( ensure( Track ) ) { UMovieSceneMarginTrack* MarginTrack = CastChecked<UMovieSceneMarginTrack>(Track); MarginTrack->SetPropertyNameAndPath( PropertyName, PropertyChangedParams->GetPropertyPathString() ); // Find or add a new section at the auto-key time and changing the property same property // AddKeyToSection is not actually a virtual, it's redefined in each class with a different type bool bSuccessfulAdd = MarginTrack->AddKeyToSection( KeyTime, Key ); if (bSuccessfulAdd) { MarginTrack->SetAsShowable(); } } } } }
bool FParticleTrackEditor::AddKeyInternal( float KeyTime, const TArray<TWeakObjectPtr<UObject>> Objects ) { bool bHandleCreated = false; bool bTrackCreated = 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, UMovieSceneParticleTrack::StaticClass()); UMovieSceneTrack* Track = TrackResult.Track; bTrackCreated |= TrackResult.bWasCreated; if (bTrackCreated && ensure(Track)) { UMovieSceneParticleTrack* ParticleTrack = Cast<UMovieSceneParticleTrack>(Track); ParticleTrack->AddNewSection(KeyTime); ParticleTrack->SetDisplayName(LOCTEXT("TrackName", "Particle System")); } } } return bHandleCreated || bTrackCreated; }
void FAnimationTrackEditor::AddKeyInternal( float KeyTime, const TArray<UObject*> Objects, class UAnimSequence* AnimSequence ) { for( int32 ObjectIndex = 0; ObjectIndex < Objects.Num(); ++ObjectIndex ) { UObject* Object = Objects[ObjectIndex]; FGuid ObjectHandle = FindOrCreateHandleToObject( Object ); if (ObjectHandle.IsValid()) { UMovieSceneTrack* Track = GetTrackForObject( ObjectHandle, UMovieSceneAnimationTrack::StaticClass(), FName("Animation")); if (ensure(Track)) { Cast<UMovieSceneAnimationTrack>(Track)->AddNewAnimation( KeyTime, AnimSequence ); } } } }
void FParticleTrackEditor::AddKeyInternal( float KeyTime, const TArray<UObject*> Objects, bool bTrigger) { for( int32 ObjectIndex = 0; ObjectIndex < Objects.Num(); ++ObjectIndex ) { UObject* Object = Objects[ObjectIndex]; FGuid ObjectHandle = FindOrCreateHandleToObject( Object ); if (ObjectHandle.IsValid()) { UMovieSceneTrack* Track = GetTrackForObject( ObjectHandle, UMovieSceneParticleTrack::StaticClass(), FName("ParticleSystem")); if (ensure(Track)) { Cast<UMovieSceneParticleTrack>(Track)->AddNewParticleSystem( KeyTime, bTrigger ); } } } }
void F3DPathTrackEditor::ActorSocketPicked(const FName SocketName, USceneComponent* Component, AActor* ParentActor, FGuid ObjectGuid, UMovieSceneSection* Section) { if (Section != nullptr) { const FScopedTransaction Transaction(LOCTEXT("UndoSetPath", "Set Path")); UMovieScene3DPathSection* PathSection = (UMovieScene3DPathSection*)(Section); FGuid SplineId = FindOrCreateHandleToObject(ParentActor).Handle; if (SplineId.IsValid()) { PathSection->SetConstraintId(SplineId); } } else if (ObjectGuid.IsValid()) { TArray<TWeakObjectPtr<UObject>> OutObjects; GetSequencer()->GetRuntimeObjects( GetSequencer()->GetFocusedMovieSceneSequenceInstance(), ObjectGuid, OutObjects); AnimatablePropertyChanged( FOnKeyProperty::CreateRaw( this, &F3DPathTrackEditor::AddKeyInternal, OutObjects, ParentActor) ); } }
void F3DAttachTrackEditor::ActorSocketPicked(const FName SocketName, AActor* ParentActor, FGuid ObjectGuid, UMovieSceneSection* Section) { if (ObjectGuid.IsValid()) { TArray<UObject*> OutObjects; GetSequencer()->GetRuntimeObjects( GetSequencer()->GetFocusedMovieSceneSequenceInstance(), ObjectGuid, OutObjects); AnimatablePropertyChanged( FOnKeyProperty::CreateRaw( this, &F3DAttachTrackEditor::AddKeyInternal, OutObjects, SocketName, ParentActor) ); } else if (Section != nullptr) { const FScopedTransaction Transaction(LOCTEXT("UndoSetAttach", "Set Attach")); UMovieScene3DAttachSection* AttachSection = (UMovieScene3DAttachSection*)(Section); FGuid ActorId = FindOrCreateHandleToObject(ParentActor).Handle; if (ActorId.IsValid()) { AttachSection->SetConstraintId(ActorId); AttachSection->AttachSocketName = SocketName; } } }
void F2DTransformTrackEditor::OnKeyTransform( float KeyTime, const FKeyPropertyParams* PropertyKeyParams ) { TArray<const void*> TransformValues; PropertyKeyParams->PropertyHandle->AccessRawData( TransformValues ); FName PropertyName = PropertyKeyParams->PropertyHandle->GetProperty()->GetFName(); for( int32 ObjectIndex = 0; ObjectIndex < PropertyKeyParams->ObjectsThatChanged.Num(); ++ObjectIndex ) { UObject* Object = PropertyKeyParams->ObjectsThatChanged[ObjectIndex]; FWidgetTransform TransformValue = *(const FWidgetTransform*)TransformValues[ObjectIndex]; F2DTransformKey Key; Key.bAddKeyEvenIfUnchanged = !PropertyKeyParams->bRequireAutoKey; Key.CurveName = PropertyKeyParams->InnerStructPropertyName; Key.Value = TransformValue; FGuid ObjectHandle = FindOrCreateHandleToObject( Object ); if (ObjectHandle.IsValid()) { UMovieSceneTrack* Track = GetTrackForObject( ObjectHandle, UMovieScene2DTransformTrack::StaticClass(), PropertyName ); if( ensure( Track ) ) { UMovieScene2DTransformTrack* TransformTrack = CastChecked<UMovieScene2DTransformTrack>(Track); TransformTrack->SetPropertyNameAndPath( PropertyName, PropertyKeyParams->PropertyPath ); // Find or add a new section at the auto-key time and changing the property same property // AddKeyToSection is not actually a virtual, it's redefined in each class with a different type bool bSuccessfulAdd = TransformTrack->AddKeyToSection( KeyTime, Key ); if (bSuccessfulAdd) { TransformTrack->SetAsShowable(); } } } } }