void UAnimSingleNodeInstance::SetPosition(float InPosition, bool bFireNotifies) { float PreviousTime = CurrentTime; CurrentTime = FMath::Clamp<float>(InPosition, 0.f, GetLength()); if (FAnimMontageInstance* CurMontageInstance = GetActiveMontageInstance()) { CurMontageInstance->SetPosition(CurrentTime); } // Handle notifies // the way AnimInstance handles notifies doesn't work for single node because this does not tick or anything // this will need to handle manually, emptying, it and collect it, and trigger them at once. if (bFireNotifies) { UAnimSequenceBase * SequenceBase = Cast<UAnimSequenceBase> (CurrentAsset); if (SequenceBase) { AnimNotifies.Empty(); TArray<const FAnimNotifyEvent*> Notifies; SequenceBase->GetAnimNotifiesFromDeltaPositions(PreviousTime, CurrentTime, Notifies); if ( Notifies.Num() > 0 ) { // single node instance only has 1 asset at a time AddAnimNotifies(Notifies, 1.0f); } TriggerAnimNotifies(0.f); } } }
void UAnimSingleNodeInstance::SetPosition(float InPosition, bool bFireNotifies) { float PreviousTime = CurrentTime; CurrentTime = FMath::Clamp<float>(InPosition, 0.f, GetLength()); if (FAnimMontageInstance* CurMontageInstance = GetActiveMontageInstance()) { CurMontageInstance->SetPosition(CurrentTime); } // Handle notifies // the way AnimInstance handles notifies doesn't work for single node because this does not tick or anything // this will need to handle manually, emptying, it and collect it, and trigger them at once. if (bFireNotifies) { UAnimSequenceBase * SequenceBase = Cast<UAnimSequenceBase> (CurrentAsset); if (SequenceBase) { AnimNotifies.Empty(); TArray<const FAnimNotifyEvent*> Notifies; SequenceBase->GetAnimNotifiesFromDeltaPositions(PreviousTime, CurrentTime, Notifies); if ( Notifies.Num() > 0 ) { // single node instance only has 1 asset at a time AddAnimNotifies(Notifies, 1.0f); } TriggerAnimNotifies(0.f); // since this is singlenode instance, if position changes, we can't keep old morphtarget curves // we clear it and evaluate curve here with new asset. MorphTargetCurves.Empty(); MaterialParameterCurves.Empty(); // Evaluate Curve data now - even if time did not move, we still need to return curve if it exists SequenceBase->EvaluateCurveData(this, CurrentTime, 1.0); } } }