void UAnimComposite::GetAnimationPose(FCompactPose& OutPose, FBlendedCurve& OutCurve, const FAnimExtractContext& ExtractionContext) const { AnimationTrack.GetAnimationPose(OutPose, OutCurve, ExtractionContext); FBlendedCurve CompositeCurve; CompositeCurve.InitFrom(OutCurve); EvaluateCurveData(CompositeCurve, ExtractionContext.CurrentTime); // combine both curve OutCurve.Combine(CompositeCurve); }
void UAnimSequenceBase::TickAssetPlayerInstance(const FAnimTickRecord& Instance, class UAnimInstance* InstanceOwner, FAnimAssetTickContext& Context) const { float& CurrentTime = *(Instance.TimeAccumulator); const float PreviousTime = CurrentTime; const float PlayRate = Instance.PlayRateMultiplier * this->RateScale; float MoveDelta = 0.f; if( Context.IsLeader() ) { const float DeltaTime = Context.GetDeltaTime(); MoveDelta = PlayRate * DeltaTime; if( MoveDelta != 0.f ) { // Advance time FAnimationRuntime::AdvanceTime(Instance.bLooping, MoveDelta, CurrentTime, SequenceLength); } Context.SetSyncPoint(CurrentTime / SequenceLength); } else { // Follow the leader CurrentTime = Context.GetSyncPoint() * SequenceLength; //@TODO: NOTIFIES: Calculate AdvanceType based on what the new delta time is if( CurrentTime != PreviousTime ) { // Figure out delta time MoveDelta = CurrentTime - PreviousTime; // if we went against play rate, then loop around. if( (MoveDelta * PlayRate) < 0.f ) { MoveDelta += FMath::Sign<float>(PlayRate) * SequenceLength; } } } OnAssetPlayerTickedInternal(Context, PreviousTime, MoveDelta, Instance, InstanceOwner); // Evaluate Curve data now - even if time did not move, we still need to return curve if it exists EvaluateCurveData(InstanceOwner, CurrentTime, Instance.EffectiveBlendWeight); }