Skip to content

Commit 99b40a4

Browse files
committed
Improve distance calculations
1 parent 963b364 commit 99b40a4

2 files changed

Lines changed: 20 additions & 10 deletions

File tree

Source/TrickyAnimationComponents/Private/SplineAnimationComponent.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,8 @@ void USplineAnimationComponent::AnimateAlongSpline(const float Progress) const
428428

429429
void 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+
}

Source/TrickyAnimationComponents/Public/SplineAnimationComponent.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,6 @@ class TRICKYANIMATIONCOMPONENTS_API USplineAnimationComponent : public UActorCom
347347
bool HasSplineComponent() const;
348348

349349
bool IsStoppingAtPoints() const;
350+
351+
float CalculateDistance(const float Progress) const;
350352
};

0 commit comments

Comments
 (0)