void UAnimInstance::SequenceAdvanceImmediate(UAnimSequenceBase* Sequence, bool bLooping, float PlayRate, float DeltaSeconds, float& CurrentTime) { FAnimTickRecord TickRecord; MakeSequenceTickRecord(TickRecord, Sequence, bLooping, PlayRate, /*FinalBlendWeight=*/ 1.0f, CurrentTime); FAnimAssetTickContext TickContext(DeltaSeconds); TickRecord.SourceAsset->TickAssetPlayerInstance(TickRecord, this, TickContext); }
void UAnimSingleNodeInstance::NativeUpdateAnimation(float DeltaTimeX) { float NewPlayRate = PlayRate; UAnimSequence* PreviewBasePose = NULL; if (bPlaying == false) { // we still have to tick animation when bPlaying is false because NewPlayRate = 0.f; } if(CurrentAsset != NULL) { FAnimGroupInstance* SyncGroup; if (UBlendSpaceBase* BlendSpace = Cast<UBlendSpaceBase>(CurrentAsset)) { FAnimTickRecord& TickRecord = CreateUninitializedTickRecord(INDEX_NONE, /*out*/ SyncGroup); MakeBlendSpaceTickRecord(TickRecord, BlendSpace, BlendSpaceInput, BlendSampleData, BlendFilter, bLooping, NewPlayRate, 1.f, /*inout*/ CurrentTime); #if WITH_EDITORONLY_DATA PreviewBasePose = BlendSpace->PreviewBasePose; #endif } else if (UAnimSequence* Sequence = Cast<UAnimSequence>(CurrentAsset)) { FAnimTickRecord& TickRecord = CreateUninitializedTickRecord(INDEX_NONE, /*out*/ SyncGroup); MakeSequenceTickRecord(TickRecord, Sequence, bLooping, NewPlayRate, 1.f, /*inout*/ CurrentTime); // if it's not looping, just set play to be false when reached to end if (!bLooping) { if ((NewPlayRate < 0.f && CurrentTime <= 0.f) || (NewPlayRate > 0.f && CurrentTime >= Sequence->SequenceLength)) { SetPlaying(false); } } } else if(UAnimComposite* Composite = Cast<UAnimComposite>(CurrentAsset)) { FAnimTickRecord& TickRecord = CreateUninitializedTickRecord(INDEX_NONE, /*out*/ SyncGroup); MakeSequenceTickRecord(TickRecord, Composite, bLooping, NewPlayRate, 1.f, /*inout*/ CurrentTime); // if it's not looping, just set play to be false when reached to end if (!bLooping) { if ((NewPlayRate < 0.f && CurrentTime <= 0.f) || (NewPlayRate > 0.f && CurrentTime >= Composite->SequenceLength)) { SetPlaying(false); } } } else if (UAnimMontage * Montage = Cast<UAnimMontage>(CurrentAsset)) { // Full weight , if you don't have slot track, you won't be able to see animation playing if ( Montage->SlotAnimTracks.Num() > 0 ) { UpdateSlotNodeWeight(Montage->SlotAnimTracks[0].SlotName, 1.f); } // get the montage position // @todo anim: temporarily just choose first slot and show the location FAnimMontageInstance * ActiveMontageInstance = GetActiveMontageInstance(); if (ActiveMontageInstance) { CurrentTime = ActiveMontageInstance->GetPosition(); } else if (bPlaying) { SetPlaying(false); } #if WITH_EDITORONLY_DATA PreviewBasePose = Montage->PreviewBasePose; #endif } } else if(CurrentVertexAnim != NULL) { float MoveDelta = DeltaTimeX * NewPlayRate; FAnimationRuntime::AdvanceTime(bLooping, MoveDelta, CurrentTime, CurrentVertexAnim->GetAnimLength()); } #if WITH_EDITORONLY_DATA if(PreviewBasePose) { float MoveDelta = DeltaTimeX * NewPlayRate; const bool bIsPreviewPoseLooping = true; FAnimationRuntime::AdvanceTime(bIsPreviewPoseLooping, MoveDelta, PreviewPoseCurrentTime, PreviewBasePose->SequenceLength); } #endif }