< Summary

Information
Class: Gravitas.CollisionHandling.ContinuousCollisionImpulsePolicy
Assembly: Gravitas
File(s): /home/runner/work/Gravitas/Gravitas/src/Gravitas/CollisionHandling/Continuous/ContinuousCollisionImpulsePolicy.cs
Line coverage
100%
Covered lines: 67
Uncovered lines: 0
Coverable lines: 67
Total lines: 176
Line coverage: 100%
Branch coverage
100%
Covered branches: 30
Total branches: 30
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
TryResolveVelocityDelta(...)100%22100%
TryResolveVelocityDelta(...)100%22100%
TryResolveVelocityDelta(...)100%88100%
TryResolveVelocityDelta(...)100%66100%
TryResolveSourceNormal(...)100%44100%
TryResolveSourceNormal(...)100%44100%
TryResolveImpactNormal(...)100%22100%
TryResolveImpactNormal(...)100%22100%

File(s)

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

#LineLine coverage
 1//=======================================================================
 2// ContinuousCollisionImpulsePolicy.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
 12internal static class ContinuousCollisionImpulsePolicy
 13{
 14    internal static bool TryResolveVelocityDelta(
 15        Vector3d signedNormal,
 16        Fixed64 normalVelocity,
 17        Fixed64 responseFactor,
 18        Fixed64 bodyInverseMass,
 19        Fixed64 constrainedInverseMass,
 20        out Vector3d velocityDelta)
 21    {
 3222        if (bodyInverseMass == Fixed64.Zero)
 23        {
 824            velocityDelta = default;
 825            return true;
 26        }
 27
 2428        bool resolved = Fixed64.TryMultiplyDivide(
 2429            normalVelocity,
 2430            responseFactor,
 2431            bodyInverseMass,
 2432            constrainedInverseMass,
 2433            out Fixed64 speedDelta);
 2434        velocityDelta = signedNormal * speedDelta;
 2435        return resolved;
 36    }
 37
 38    internal static bool TryResolveVelocityDelta(
 39        Vector2d signedNormal,
 40        Fixed64 normalVelocity,
 41        Fixed64 responseFactor,
 42        Fixed64 bodyInverseMass,
 43        Fixed64 constrainedInverseMass,
 44        out Vector2d velocityDelta)
 45    {
 9246        if (bodyInverseMass == Fixed64.Zero)
 47        {
 2748            velocityDelta = default;
 2749            return true;
 50        }
 51
 6552        bool resolved = Fixed64.TryMultiplyDivide(
 6553            normalVelocity,
 6554            responseFactor,
 6555            bodyInverseMass,
 6556            constrainedInverseMass,
 6557            out Fixed64 speedDelta);
 6558        velocityDelta = signedNormal * speedDelta;
 6559        return resolved;
 60    }
 61
 62    internal static bool TryResolveVelocityDelta(
 63        Vector3d normal,
 64        Fixed64 responseSpeed,
 65        Fixed64 bodyInverseMass,
 66        Fixed64 constrainedInverseMass,
 67        out Vector3d velocityDelta)
 68    {
 1255569        if (bodyInverseMass == Fixed64.Zero)
 70        {
 771            velocityDelta = default;
 772            return true;
 73        }
 74
 1254875        if (!Fixed64.TryMultiplyDivide(normal.X, responseSpeed, bodyInverseMass, constrainedInverseMass, out Fixed64 x)
 1254876            || !Fixed64.TryMultiplyDivide(normal.Y, responseSpeed, bodyInverseMass, constrainedInverseMass, out Fixed64 
 1254877            || !Fixed64.TryMultiplyDivide(normal.Z, responseSpeed, bodyInverseMass, constrainedInverseMass, out Fixed64 
 78        {
 1579            velocityDelta = default;
 1580            return false;
 81        }
 82
 1253383        velocityDelta = new Vector3d(x, y, z);
 1253384        return true;
 85    }
 86
 87    internal static bool TryResolveVelocityDelta(
 88        Vector2d normal,
 89        Fixed64 responseSpeed,
 90        Fixed64 bodyInverseMass,
 91        Fixed64 constrainedInverseMass,
 92        out Vector2d velocityDelta)
 93    {
 37594        if (bodyInverseMass == Fixed64.Zero)
 95        {
 6196            velocityDelta = default;
 6197            return true;
 98        }
 99
 314100        if (!Fixed64.TryMultiplyDivide(normal.X, responseSpeed, bodyInverseMass, constrainedInverseMass, out Fixed64 x)
 314101            || !Fixed64.TryMultiplyDivide(normal.Y, responseSpeed, bodyInverseMass, constrainedInverseMass, out Fixed64 
 102        {
 14103            velocityDelta = default;
 14104            return false;
 105        }
 106
 300107        velocityDelta = new Vector2d(x, y);
 300108        return true;
 109    }
 110
 111    internal static bool TryResolveSourceNormal(
 112        Vector3d normalForSource,
 113        Vector3d sourceDisplacement,
 114        out Vector3d normal)
 115    {
 14116        if (normalForSource.MagnitudeSquared > Fixed64.Epsilon)
 117        {
 12118            normal = normalForSource.Normalized;
 12119            return true;
 120        }
 121
 2122        if (sourceDisplacement.MagnitudeSquared > Fixed64.Epsilon)
 123        {
 1124            normal = -sourceDisplacement.Normalized;
 1125            return true;
 126        }
 127
 1128        normal = Vector3d.Zero;
 1129        return false;
 130    }
 131
 132    internal static bool TryResolveSourceNormal(
 133        Vector2d normalForSource,
 134        Vector2d sourceDisplacement,
 135        out Vector2d normal)
 136    {
 12137        if (normalForSource.MagnitudeSquared > Fixed64.Epsilon)
 138        {
 10139            normal = normalForSource.Normalized;
 10140            return true;
 141        }
 142
 2143        if (sourceDisplacement.MagnitudeSquared > Fixed64.Epsilon)
 144        {
 1145            normal = -sourceDisplacement.Normalized;
 1146            return true;
 147        }
 148
 1149        normal = Vector2d.Zero;
 1150        return false;
 151    }
 152
 153    internal static bool TryResolveImpactNormal(Vector3d normalForSource, out Vector3d normal)
 154    {
 76155        if (normalForSource.MagnitudeSquared > Fixed64.Epsilon)
 156        {
 72157            normal = normalForSource.Normalized;
 72158            return true;
 159        }
 160
 4161        normal = Vector3d.Zero;
 4162        return false;
 163    }
 164
 165    internal static bool TryResolveImpactNormal(Vector2d normalForSource, out Vector2d normal)
 166    {
 81167        if (normalForSource.MagnitudeSquared > Fixed64.Epsilon)
 168        {
 67169            normal = normalForSource.Normalized;
 67170            return true;
 171        }
 172
 14173        normal = Vector2d.Zero;
 14174        return false;
 175    }
 176}