< Summary

Information
Class: Gravitas.CollisionHandling.ContinuousCollisionMotionSegment2D
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/CollisionHandling/Continuous/ContinuousCollisionMotionSegment2D.cs
Line coverage
100%
Covered lines: 25
Uncovered lines: 0
Coverable lines: 25
Total lines: 80
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_AngularDistance()100%11100%
SamplePosition(...)100%11100%
SampleRotation(...)100%11100%
TryResolveMotionBound(...)100%22100%
ResolveLocalFraction(...)100%11100%

File(s)

/home/runner/work/Gravitas/Gravitas/src/Gravitas/CollisionHandling/Continuous/ContinuousCollisionMotionSegment2D.cs

#LineLine coverage
 1//=======================================================================
 2// ContinuousCollisionMotionSegment2D.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2026-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using FixedMathSharp;
 9
 10namespace Gravitas.CollisionHandling;
 11
 12/// <summary>
 13/// One immutable, normalized-time piece of a 2D body's prepared CCD trajectory.
 14/// </summary>
 15internal readonly struct ContinuousCollisionMotionSegment2D
 16{
 17    public ContinuousCollisionMotionSegment2D(
 18        Fixed64 startFraction,
 19        Fixed64 endFraction,
 20        Vector2d startPosition,
 21        Vector2d endPosition,
 22        Vector2d displacement,
 23        Fixed64 startRotation,
 24        Fixed64 angularDelta,
 25        Fixed64 angularVelocity)
 26    {
 320127        StartFraction = startFraction;
 320128        EndFraction = endFraction;
 320129        StartPosition = startPosition;
 320130        EndPosition = endPosition;
 320131        Displacement = displacement;
 320132        StartRotation = startRotation;
 320133        AngularDelta = angularDelta;
 320134        AngularVelocity = angularVelocity;
 320135    }
 36
 37    public Fixed64 StartFraction { get; }
 38    public Fixed64 EndFraction { get; }
 39    public Vector2d StartPosition { get; }
 40    public Vector2d EndPosition { get; }
 41    public Vector2d Displacement { get; }
 42    public Fixed64 StartRotation { get; }
 43    public Fixed64 AngularDelta { get; }
 44    public Fixed64 AngularVelocity { get; }
 451745    public Fixed64 AngularDistance => AngularDelta.Abs();
 46
 47    public Vector2d SamplePosition(Fixed64 frameFraction) =>
 398148        Vector2d.Lerp(StartPosition, EndPosition, ResolveLocalFraction(frameFraction));
 49
 50    public Fixed64 SampleRotation(Fixed64 frameFraction) =>
 387051        StartRotation + AngularDelta * ResolveLocalFraction(frameFraction);
 52
 53    public bool TryResolveMotionBound(
 54        Fixed64 lowerFraction,
 55        Fixed64 upperFraction,
 56        Fixed64 pivotRadius,
 57        out Fixed64 motionBound)
 58    {
 313759        Fixed64 segmentSpan = EndFraction - StartFraction;
 313760        Fixed64 localSpan = (upperFraction - lowerFraction) / segmentSpan;
 313761        if (!Vector2d.TrySubtract(EndPosition, StartPosition, out Vector2d exactDisplacement))
 62        {
 163            motionBound = default;
 164            return false;
 65        }
 66
 313667        return ContinuousCollisionMath.TryResolveRotationalIntervalMotionBound(
 313668            exactDisplacement,
 313669            AngularDistance,
 313670            pivotRadius,
 313671            localSpan,
 313672            out motionBound);
 73    }
 74
 75    private Fixed64 ResolveLocalFraction(Fixed64 frameFraction)
 76    {
 785177        Fixed64 span = EndFraction - StartFraction;
 785178        return FixedMath.Clamp01((frameFraction - StartFraction) / span);
 79    }
 80}