< Summary

Information
Class: Gravitas.CollisionHandling.ContinuousCollisionMath
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/CollisionHandling/Continuous/ContinuousCollisionMath.cs
Line coverage
100%
Covered lines: 211
Uncovered lines: 0
Coverable lines: 211
Total lines: 481
Line coverage: 100%
Branch coverage
100%
Covered branches: 78
Total branches: 78
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

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

#LineLine coverage
 1//=======================================================================
 2// ContinuousCollisionMath.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;
 9using FixedMathSharp.Geometry;
 10using System.Runtime.CompilerServices;
 11
 12namespace Gravitas.CollisionHandling;
 13
 14internal static class ContinuousCollisionMath
 15{
 16    public const int RotationalIntervalMaxDepth = 12;
 17    public const int RotationalIntervalNodeBudget = 64;
 18
 19    public enum IntervalSearchStatus : byte
 20    {
 21        CertifiedNoHit,
 22        ExactHit,
 23        Unresolved,
 24    }
 25
 26    // Pose reconstruction uses normalized fixed-point rotations. Cover both
 27    // absolute operation rounding and its radius-scaled positional effect;
 28    // failure to represent either term keeps the interval unresolved.
 129    private static readonly Fixed64 RotationalMotionUncertainty = Fixed64.Epsilon * 64;
 130    private static readonly Fixed64 RotationalRelativeUncertainty =
 131        FixedMath.CanonicalSinCosErrorBound * 16;
 132    private static readonly Fixed64 ClosestFeatureRelativeUncertainty =
 133        Fixed64.MinIncrement * 128;
 34
 35    public readonly struct RotationalInterval
 36    {
 37        public RotationalInterval(Fixed64 lowerTime, Fixed64 upperTime, int depth)
 38        {
 1042439            LowerTime = lowerTime;
 1042440            UpperTime = upperTime;
 1042441            Depth = depth;
 1042442        }
 43
 44        public Fixed64 LowerTime { get; }
 45
 46        public Fixed64 UpperTime { get; }
 47
 48        public int Depth { get; }
 49    }
 50
 51    public static bool TryResolveRotationalSearchLimit(
 52        RotationalInterval interval,
 53        int processedNodeCount,
 54        bool hasWitness,
 55        Fixed64 witnessTime,
 56        out Fixed64 safeTime,
 57        out Fixed64 contactTime,
 58        out bool retainsWitness)
 59    {
 697360        bool nodeBudgetExhausted = processedNodeCount >= RotationalIntervalNodeBudget;
 697361        if (!nodeBudgetExhausted && interval.Depth < RotationalIntervalMaxDepth)
 62        {
 649163            safeTime = default;
 649164            contactTime = default;
 649165            retainsWitness = false;
 649166            return false;
 67        }
 68
 48269        retainsWitness = hasWitness;
 48270        contactTime = hasWitness ? witnessTime : interval.LowerTime;
 71        // Max depth defines the accepted temporal resolution, so its same-target
 72        // witness may resolve this leaf only when it brackets the leaf itself. A
 73        // global witness from a later interval cannot certify the unresolved gap.
 74        // Hard node-budget exhaustion has no convergence guarantee either.
 48275        bool witnessIsBracketed = hasWitness
 48276            && witnessTime >= interval.LowerTime
 48277            && witnessTime <= interval.UpperTime;
 48278        safeTime = witnessIsBracketed && !nodeBudgetExhausted
 48279            ? witnessTime
 48280            : interval.LowerTime;
 48281        return true;
 82    }
 83
 84    public static bool ShouldContinueRotationalArbiter(
 85        Vector2d displacement,
 86        Fixed64 angularDistance) =>
 387        angularDistance > Fixed64.Epsilon
 388        || displacement.MagnitudeSquared > Fixed64.Epsilon;
 89
 90    public static bool TryResolveRotationalIntervalMotionBound(
 91        Vector2d displacement,
 92        Fixed64 angularDistance,
 93        Fixed64 pivotRadius,
 94        Fixed64 intervalSpan,
 95        out Fixed64 motionBound)
 96    {
 712497        Vector2d halfIntervalDisplacement = displacement * (intervalSpan * Fixed64.Half);
 712498        bool linearResolved = Vector2d.TryGetMagnitude(
 712499            halfIntervalDisplacement,
 7124100            out Fixed64 linearMotion);
 7124101        bool angularResolved = Fixed64.TryMultiplyDivide(
 7124102            angularDistance,
 7124103            pivotRadius,
 7124104            intervalSpan,
 7124105            Fixed64.Two,
 7124106            out Fixed64 angularMotion);
 7124107        bool poseResolved = Fixed64.TryMultiplyDivide(
 7124108            pivotRadius,
 7124109            RotationalRelativeUncertainty,
 7124110            Fixed64.One,
 7124111            out Fixed64 poseUncertainty);
 7124112        bool combined = Fixed64.TryAdd(linearMotion, angularMotion, out motionBound)
 7124113            & Fixed64.TryAdd(motionBound, poseUncertainty, out motionBound)
 7124114            & Fixed64.TryAdd(motionBound, RotationalMotionUncertainty, out motionBound);
 7124115        if (!(linearResolved & angularResolved & poseResolved & combined))
 116        {
 2117            motionBound = default;
 2118            return false;
 119        }
 120
 7122121        return true;
 122    }
 123
 124    public static bool TryResolveRotationalIntervalMotionBound(
 125        Vector3d displacement,
 126        Fixed64 angularDistance,
 127        Fixed64 pivotRadius,
 128        Fixed64 intervalSpan,
 129        out Fixed64 motionBound)
 130    {
 9567131        Vector3d halfIntervalDisplacement = displacement * (intervalSpan * Fixed64.Half);
 9567132        bool linearResolved = Vector3d.TryGetMagnitude(
 9567133            halfIntervalDisplacement,
 9567134            out Fixed64 linearMotion);
 9567135        bool angularResolved = Fixed64.TryMultiplyDivide(
 9567136            angularDistance,
 9567137            pivotRadius,
 9567138            intervalSpan,
 9567139            Fixed64.Two,
 9567140            out Fixed64 angularMotion);
 9567141        bool poseResolved = Fixed64.TryMultiplyDivide(
 9567142            pivotRadius,
 9567143            RotationalRelativeUncertainty,
 9567144            Fixed64.One,
 9567145            out Fixed64 poseUncertainty);
 9567146        bool combined = Fixed64.TryAdd(linearMotion, angularMotion, out motionBound)
 9567147            & Fixed64.TryAdd(motionBound, poseUncertainty, out motionBound)
 9567148            & Fixed64.TryAdd(motionBound, RotationalMotionUncertainty, out motionBound);
 9567149        if (!(linearResolved & angularResolved & poseResolved & combined))
 150        {
 2151            motionBound = default;
 2152            return false;
 153        }
 154
 9565155        return true;
 156    }
 157
 158    public static bool AreBoundsSeparatedByMoreThan(
 159        FixedBoundArea source,
 160        FixedBoundArea target,
 161        Fixed64 motionBound) =>
 312162        IsAxisGapGreaterThan(source.Min.X, source.Max.X, target.Min.X, target.Max.X, motionBound)
 312163        | IsAxisGapGreaterThan(source.Min.Y, source.Max.Y, target.Min.Y, target.Max.Y, motionBound);
 164
 165    public static bool AreBoundsSeparatedByMoreThan(
 166        FixedBoundBox source,
 167        FixedBoundBox target,
 168        Fixed64 motionBound) =>
 922169        IsAxisGapGreaterThan(source.Min.X, source.Max.X, target.Min.X, target.Max.X, motionBound)
 922170        | IsAxisGapGreaterThan(source.Min.Y, source.Max.Y, target.Min.Y, target.Max.Y, motionBound)
 922171        | IsAxisGapGreaterThan(source.Min.Z, source.Max.Z, target.Min.Z, target.Max.Z, motionBound);
 172
 173    public static bool TrySubtractClosestFeatureUncertainty(
 174        Fixed64 separationGap,
 175        Fixed64 characteristicScale,
 176        out Fixed64 conservativeGap)
 177    {
 6759178        bool inputValid = separationGap > Fixed64.Zero
 6759179            & characteristicScale >= Fixed64.Zero;
 6759180        bool scaled = Fixed64.TryMultiplyDivide(
 6759181            characteristicScale,
 6759182            ClosestFeatureRelativeUncertainty,
 6759183            Fixed64.One,
 6759184            out Fixed64 scaledUncertainty);
 6759185        bool combined = Fixed64.TryAdd(
 6759186            scaledUncertainty,
 6759187            RotationalMotionUncertainty,
 6759188            out Fixed64 uncertainty);
 6759189        bool subtracted = Fixed64.TrySubtract(
 6759190            separationGap,
 6759191            uncertainty,
 6759192            out conservativeGap);
 6759193        if (!(inputValid & scaled & combined & subtracted))
 194        {
 1500195            conservativeGap = default;
 1500196            return false;
 197        }
 198
 5259199        return conservativeGap > Fixed64.Zero;
 200    }
 201
 202    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 203    private static bool IsAxisGapGreaterThan(
 204        Fixed64 sourceMin,
 205        Fixed64 sourceMax,
 206        Fixed64 targetMin,
 207        Fixed64 targetMax,
 208        Fixed64 motionBound)
 209    {
 3390210        if (sourceMax < targetMin)
 573211            return !Fixed64.TrySubtract(targetMin, sourceMax, out Fixed64 gap)
 573212                | gap > motionBound;
 213
 2817214        return targetMax < sourceMin
 2817215            & (!Fixed64.TrySubtract(sourceMin, targetMax, out Fixed64 reverseGap)
 2817216                | reverseGap > motionBound);
 217    }
 218
 219    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 220    public static bool IsWithinProxyRadius(
 221        Vector3d displacement,
 222        Fixed64 displacementMagnitudeSquared,
 223        Fixed64 proxyRadius)
 224    {
 16225        Fixed64 proxyRadiusSquared = proxyRadius * proxyRadius;
 16226        if (displacementMagnitudeSquared != Fixed64.MaxValue || proxyRadiusSquared != Fixed64.MaxValue)
 13227            return displacementMagnitudeSquared <= proxyRadiusSquared;
 228
 3229        return Vector3d.TryGetMagnitude(displacement, out Fixed64 displacementMagnitude)
 3230            && displacementMagnitude <= proxyRadius;
 231    }
 232
 233    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 234    public static bool IsWithinProxyRadius(
 235        Vector2d displacement,
 236        Fixed64 displacementMagnitudeSquared,
 237        Fixed64 proxyRadius)
 238    {
 13239        Fixed64 proxyRadiusSquared = proxyRadius * proxyRadius;
 13240        if (displacementMagnitudeSquared != Fixed64.MaxValue || proxyRadiusSquared != Fixed64.MaxValue)
 9241            return displacementMagnitudeSquared <= proxyRadiusSquared;
 242
 4243        return Vector2d.TryGetMagnitude(displacement, out Fixed64 displacementMagnitude)
 4244            && displacementMagnitude <= proxyRadius;
 245    }
 246
 247    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 248    public static Vector3d ResolveContactPointOnTarget(
 249        Vector3d sourceCenter,
 250        Vector3d targetCenter,
 251        Vector3d normalForSource,
 252        Fixed64 targetRadius)
 253    {
 5254        if (normalForSource.MagnitudeSquared > Fixed64.Epsilon)
 3255            return targetCenter + normalForSource * targetRadius;
 256
 2257        Vector3d fallback = sourceCenter - targetCenter;
 2258        return fallback.MagnitudeSquared > Fixed64.Epsilon
 2259            ? targetCenter + fallback.Normalized * targetRadius
 2260            : targetCenter;
 261    }
 262
 263    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 264    public static bool ShouldReplaceContinuousCollisionHit(
 265        Fixed64 candidateSafeTime,
 266        int candidateTargetId,
 267        bool hasCurrent,
 268        Fixed64 currentSafeTime,
 269        int currentTargetId)
 270    {
 455271        if (!hasCurrent)
 439272            return true;
 273
 16274        int timeCompare = candidateSafeTime.CompareTo(currentSafeTime);
 16275        if (timeCompare != 0)
 9276            return timeCompare < 0;
 277
 7278        return candidateTargetId < currentTargetId;
 279    }
 280
 281    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 282    public static void ClipTranslationalTrajectoryInterval(
 283        Fixed64 queryStart,
 284        Fixed64 segmentStart,
 285        Fixed64 segmentEnd,
 286        out Fixed64 overlapStart,
 287        out Fixed64 overlapEnd,
 288        out Fixed64 sourceStartTime,
 289        out Fixed64 sourceEndTime)
 290    {
 522291        overlapStart = FixedMath.Max(queryStart, segmentStart);
 522292        overlapEnd = segmentEnd;
 522293        Fixed64 querySpan = Fixed64.One - queryStart;
 522294        sourceStartTime = FixedMath.Clamp01((overlapStart - queryStart) / querySpan);
 522295        sourceEndTime = FixedMath.Clamp01((overlapEnd - queryStart) / querySpan);
 522296    }
 297
 298    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 299    public static bool IsSupersededTranslationalBoundaryHit(
 300        bool hitAtSegmentEnd,
 301        Fixed64 overlapEnd,
 302        int segmentIndex,
 303        int segmentCount,
 304        Fixed64 successorStart) =>
 524305        hitAtSegmentEnd
 524306        && overlapEnd < Fixed64.One
 524307        && segmentIndex + 1 < segmentCount
 524308        && successorStart == overlapEnd;
 309
 310    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 311    public static bool TryNormalizeTranslationalClosingSpeed(
 312        Fixed64 localClosingSpeed,
 313        Fixed64 sourceIntervalSpan,
 314        out Fixed64 closingSpeed)
 315    {
 409316        if (localClosingSpeed <= Fixed64.Epsilon
 409317            || sourceIntervalSpan <= Fixed64.Zero)
 318        {
 5319            closingSpeed = Fixed64.Zero;
 5320            return false;
 321        }
 322
 404323        closingSpeed = localClosingSpeed / sourceIntervalSpan;
 404324        return true;
 325    }
 326
 327    public static bool TryGetRelativeSphereOverlapDistanceInterval(
 328        Vector3d sourceStart,
 329        Vector3d sourceDisplacement,
 330        Fixed64 sourceRadius,
 331        Vector3d targetStart,
 332        Vector3d targetDisplacement,
 333        Fixed64 targetRadius,
 334        out Fixed64 entryDistance,
 335        out Fixed64 exitDistance,
 336        out Vector3d relativeDisplacement,
 337        out Fixed64 relativeLength,
 338        out Vector3d normalForSource,
 339        out Fixed64 closingSpeed)
 340    {
 249341        entryDistance = Fixed64.Zero;
 249342        exitDistance = Fixed64.Zero;
 249343        relativeDisplacement = Vector3d.Zero;
 249344        normalForSource = Vector3d.Zero;
 249345        closingSpeed = Fixed64.Zero;
 346
 249347        relativeDisplacement = ContinuousCollisionSweepRange.ValidateRelativeDisplacement(
 249348            sourceDisplacement,
 249349            targetDisplacement,
 249350            out relativeLength);
 248351        Vector3d sourceEnd = GetSweepEnd(sourceStart, sourceDisplacement);
 246352        Vector3d targetEnd = GetSweepEnd(targetStart, targetDisplacement);
 246353        if (relativeDisplacement.MagnitudeSquared <= Fixed64.Epsilon
 246354            || !HasUsableCombinedRadius(sourceRadius, targetRadius))
 355        {
 9356            return false;
 357        }
 358
 237359        if (!WideFiniteAxisIntersection.TryGetSphereDirectionDistanceInterval(
 237360                sourceStart,
 237361                relativeDisplacement,
 237362                new FixedBoundSphere(targetStart, targetRadius),
 237363                sourceRadius,
 237364                relativeLength,
 237365                out entryDistance,
 237366                out exitDistance))
 367        {
 13368            return false;
 369        }
 370
 224371        Vector3d sourceImpact = new FixedSegment(sourceStart, sourceEnd)
 224372            .GetPointAtDistance(entryDistance, relativeLength);
 224373        Vector3d targetImpact = new FixedSegment(targetStart, targetEnd)
 224374            .GetPointAtDistance(entryDistance, relativeLength);
 224375        normalForSource = ResolveNormal(targetImpact, sourceImpact, relativeDisplacement);
 224376        closingSpeed = -Vector3d.Dot(relativeDisplacement, normalForSource);
 224377        return true;
 378    }
 379
 380    public static bool TryGetRelativeCircleOverlapDistanceInterval(
 381        Vector2d sourceStart,
 382        Vector2d sourceDisplacement,
 383        Fixed64 sourceRadius,
 384        Vector2d targetStart,
 385        Vector2d targetDisplacement,
 386        Fixed64 targetRadius,
 387        out Fixed64 entryDistance,
 388        out Fixed64 exitDistance,
 389        out Vector2d relativeDisplacement,
 390        out Fixed64 relativeLength,
 391        out Vector2d normalForSource,
 392        out Fixed64 closingSpeed)
 393    {
 310394        entryDistance = Fixed64.Zero;
 310395        exitDistance = Fixed64.Zero;
 310396        relativeDisplacement = Vector2d.Zero;
 310397        normalForSource = Vector2d.Zero;
 310398        closingSpeed = Fixed64.Zero;
 399
 310400        relativeDisplacement = ContinuousCollisionSweepRange.ValidateRelativeDisplacement(
 310401            sourceDisplacement,
 310402            targetDisplacement,
 310403            out relativeLength);
 309404        Vector2d sourceEnd = GetSweepEnd(sourceStart, sourceDisplacement);
 307405        Vector2d targetEnd = GetSweepEnd(targetStart, targetDisplacement);
 307406        if (relativeDisplacement.MagnitudeSquared <= Fixed64.Epsilon
 307407            || !HasUsableCombinedRadius(sourceRadius, targetRadius))
 408        {
 5409            return false;
 410        }
 411
 302412        if (!WideFiniteAxisIntersection.TryGetCircleDirectionDistanceInterval(
 302413                sourceStart,
 302414                relativeDisplacement,
 302415                new FixedBoundCircle(targetStart, targetRadius),
 302416                sourceRadius,
 302417                relativeLength,
 302418                out entryDistance,
 302419                out exitDistance))
 420        {
 17421            return false;
 422        }
 423
 285424        Vector2d sourceImpact = new FixedSegment2d(sourceStart, sourceEnd)
 285425            .GetPointAtDistance(entryDistance, relativeLength);
 285426        Vector2d targetImpact = new FixedSegment2d(targetStart, targetEnd)
 285427            .GetPointAtDistance(entryDistance, relativeLength);
 285428        normalForSource = ResolveNormal(targetImpact, sourceImpact, relativeDisplacement);
 285429        closingSpeed = -Vector2d.Dot(relativeDisplacement, normalForSource);
 285430        return true;
 431    }
 432
 433    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 434    private static bool HasUsableCombinedRadius(Fixed64 sourceRadius, Fixed64 targetRadius)
 435    {
 540436        if (sourceRadius > Fixed64.Epsilon || targetRadius > Fixed64.Epsilon)
 539437            return true;
 438
 1439        return sourceRadius + targetRadius > Fixed64.Epsilon;
 440    }
 441
 442    private static Vector3d GetSweepEnd(
 443        Vector3d start,
 444        Vector3d displacement)
 445    {
 494446        if (!Vector3d.TryAdd(start, displacement, out Vector3d end))
 2447            throw new System.ArgumentOutOfRangeException(nameof(displacement), "Continuous collision endpoint is outside
 448
 492449        return end;
 450    }
 451
 452    private static Vector2d GetSweepEnd(
 453        Vector2d start,
 454        Vector2d displacement)
 455    {
 616456        if (!Vector2d.TryAdd(start, displacement, out Vector2d end))
 2457            throw new System.ArgumentOutOfRangeException(nameof(displacement), "Continuous collision endpoint is outside
 458
 614459        return end;
 460    }
 461
 462    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 463    private static Vector3d ResolveNormal(
 464        Vector3d targetPosition,
 465        Vector3d sourcePosition,
 466        Vector3d relativeDisplacement)
 467    {
 224468        Vector3d normal = Vector3d.GetDirection(targetPosition, sourcePosition);
 224469        return normal != Vector3d.Zero ? normal : -relativeDisplacement.Normalized;
 470    }
 471
 472    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 473    private static Vector2d ResolveNormal(
 474        Vector2d targetPosition,
 475        Vector2d sourcePosition,
 476        Vector2d relativeDisplacement)
 477    {
 285478        Vector2d normal = Vector2d.GetDirection(targetPosition, sourcePosition);
 285479        return normal != Vector2d.Zero ? normal : -relativeDisplacement.Normalized;
 480    }
 481}

Methods/Properties

.cctor()
.ctor(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,System.Int32)
TryResolveRotationalSearchLimit(Gravitas.CollisionHandling.ContinuousCollisionMath/RotationalInterval,System.Int32,System.Boolean,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,System.Boolean&)
ShouldContinueRotationalArbiter(FixedMathSharp.Vector2d,FixedMathSharp.Fixed64)
TryResolveRotationalIntervalMotionBound(FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&)
TryResolveRotationalIntervalMotionBound(FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&)
AreBoundsSeparatedByMoreThan(FixedMathSharp.Geometry.FixedBoundArea,FixedMathSharp.Geometry.FixedBoundArea,FixedMathSharp.Fixed64)
AreBoundsSeparatedByMoreThan(FixedMathSharp.Geometry.FixedBoundBox,FixedMathSharp.Geometry.FixedBoundBox,FixedMathSharp.Fixed64)
TrySubtractClosestFeatureUncertainty(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&)
IsAxisGapGreaterThan(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
IsWithinProxyRadius(FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
IsWithinProxyRadius(FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
ResolveContactPointOnTarget(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64)
ShouldReplaceContinuousCollisionHit(FixedMathSharp.Fixed64,System.Int32,System.Boolean,FixedMathSharp.Fixed64,System.Int32)
ClipTranslationalTrajectoryInterval(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&)
IsSupersededTranslationalBoundaryHit(System.Boolean,FixedMathSharp.Fixed64,System.Int32,System.Int32,FixedMathSharp.Fixed64)
TryNormalizeTranslationalClosingSpeed(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&)
TryGetRelativeSphereOverlapDistanceInterval(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,FixedMathSharp.Vector3d&,FixedMathSharp.Fixed64&,FixedMathSharp.Vector3d&,FixedMathSharp.Fixed64&)
TryGetRelativeCircleOverlapDistanceInterval(FixedMathSharp.Vector2d,FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Vector2d,FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64&,FixedMathSharp.Fixed64&,FixedMathSharp.Vector2d&,FixedMathSharp.Fixed64&,FixedMathSharp.Vector2d&,FixedMathSharp.Fixed64&)
HasUsableCombinedRadius(FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
GetSweepEnd(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
GetSweepEnd(FixedMathSharp.Vector2d,FixedMathSharp.Vector2d)
ResolveNormal(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
ResolveNormal(FixedMathSharp.Vector2d,FixedMathSharp.Vector2d,FixedMathSharp.Vector2d)