void FMovieSceneSkeletalAnimationTrackInstance::PreviewSetAnimPosition(USkeletalMeshComponent* SkeletalMeshComponent, FName SlotName, int32 ChannelIndex, UAnimSequenceBase* InAnimSequence, float InPosition, bool bLooping, bool bFireNotifies, float DeltaTime, bool bPlaying, bool bResetDynamics) { if(CanPlayAnimation(SkeletalMeshComponent, InAnimSequence)) { UAnimMontage* Montage = FAnimMontageInstance::PreviewMatineeSetAnimPositionInner(SlotName, SkeletalMeshComponent, InAnimSequence, InPosition, bLooping, bFireNotifies, DeltaTime); // if we are not playing, make sure we dont continue (as skeletal meshes can still tick us onwards) UAnimInstance* AnimInst = SkeletalMeshComponent->GetAnimInstance(); UAnimSingleNodeInstance * SingleNodeInst = SkeletalMeshComponent->GetSingleNodeInstance(); if(SingleNodeInst) { SingleNodeInst->SetPlaying(bPlaying); } else if (AnimInst) { if(Montage) { if(bPlaying) { AnimInst->Montage_Resume(Montage); } else { AnimInst->Montage_Pause(Montage); } } if(bResetDynamics) { // make sure we reset any simulations AnimInst->ResetDynamics(); } } } }
void FMovieSceneSkeletalAnimationTrackInstance::SetAnimPosition(USkeletalMeshComponent* SkeletalMeshComponent, FName SlotName, int32 ChannelIndex, UAnimSequenceBase* InAnimSequence, float InPosition, bool bLooping, bool bFireNotifies) { if (CanPlayAnimation(SkeletalMeshComponent, InAnimSequence)) { UAnimMontage* Montage = FAnimMontageInstance::SetMatineeAnimPositionInner(SlotName, SkeletalMeshComponent, InAnimSequence, InPosition, bLooping); // Ensure the sequence is not stopped UAnimInstance* AnimInst = SkeletalMeshComponent->GetAnimInstance(); UAnimSingleNodeInstance* SingleNodeInst = SkeletalMeshComponent->GetSingleNodeInstance(); if(SingleNodeInst) { SingleNodeInst->SetPlaying(true); } else if (AnimInst && Montage) { AnimInst->Montage_Resume(Montage); } } }