@@ -428,11 +428,8 @@ void USplineAnimationComponent::AnimateAlongSpline(const float Progress) const
428428
429429void USplineAnimationComponent::MoveAlongSpline (const float Progress) const
430430{
431- // TODO: To use distance offset properly, it's better to calculate distance using CurrentDistance % Length
432- const float Position = GetPositionAtSpline (CurrentPointIndex, NextPointIndex, Progress);
433- const float Distance = FMath::Fmod (Position + SplineOffset, SplineComponent->GetSplineLength ());
434431 const FVector NewLocation{
435- SplineComponent->GetLocationAtDistanceAlongSpline (Distance , ESplineCoordinateSpace::World)
432+ SplineComponent->GetLocationAtDistanceAlongSpline (CalculateDistance (Progress) , ESplineCoordinateSpace::World)
436433 };
437434
438435 GetOwner ()->SetActorLocation (NewLocation + LocationOffset);
@@ -443,10 +440,10 @@ void USplineAnimationComponent::RotateAlongSpline(const float Progress) const
443440 if (InheritRotation.bX || InheritRotation.bY || InheritRotation.bZ )
444441 {
445442 const FRotator CurrentRotation{GetOwner ()->GetActorRotation ()};
446- const float Position = GetPositionAtSpline (CurrentPointIndex, NextPointIndex, Progress);
447- const float Distance = FMath::Fmod (Position + SplineOffset, SplineComponent->GetSplineLength ());
443+
448444 const FRotator RotationAlongSpline{
449- SplineComponent->GetRotationAtDistanceAlongSpline (Distance, ESplineCoordinateSpace::World)
445+ SplineComponent->GetRotationAtDistanceAlongSpline (CalculateDistance (Progress),
446+ ESplineCoordinateSpace::World)
450447 };
451448
452449 const float NewRoll = InheritRotation.bX ? RotationAlongSpline.Roll : CurrentRotation.Roll ;
@@ -462,9 +459,7 @@ void USplineAnimationComponent::ScaleAlongSpline(const float Progress) const
462459 if (InheritScale.bX || InheritScale.bY || InheritScale.bZ )
463460 {
464461 const FVector CurrentScale{GetOwner ()->GetActorScale3D ()};
465- const float Position = GetPositionAtSpline (CurrentPointIndex, NextPointIndex, Progress);
466- const float Distance = FMath::Fmod (Position + SplineOffset, SplineComponent->GetSplineLength ());
467- const FVector ScaleAlongSpline{SplineComponent->GetScaleAtDistanceAlongSpline (Distance)};
462+ const FVector ScaleAlongSpline{SplineComponent->GetScaleAtDistanceAlongSpline (CalculateDistance (Progress))};
468463
469464 const float NewScaleX = InheritScale.bX ? ScaleAlongSpline.X : CurrentScale.X ;
470465 const float NewScaleY = InheritScale.bY ? ScaleAlongSpline.Y : CurrentScale.Y ;
@@ -705,3 +700,16 @@ bool USplineAnimationComponent::IsStoppingAtPoints() const
705700{
706701 return StopMode != ESplineAnimationStopMode::None;
707702}
703+
704+ float USplineAnimationComponent::CalculateDistance (const float Progress) const
705+ {
706+ const float Position = GetPositionAtSpline (CurrentPointIndex, NextPointIndex, Progress);
707+ float Distance = FMath::Fmod (Position + SplineOffset, SplineComponent->GetSplineLength ());
708+
709+ if (Distance < 0 .f )
710+ {
711+ Distance = SplineComponent->GetSplineLength () + Distance;
712+ }
713+
714+ return Distance;
715+ }
0 commit comments