< Summary

Information
Class: FixedMathSharp.Geometry.CapsulePrismContactDepth
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Convex/CapsulePrismContactDepth.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 70
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
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%
.ctor(...)100%11100%
Compare(...)100%1010100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Convex/CapsulePrismContactDepth.cs

#LineLine coverage
 1//=======================================================================
 2// CapsulePrismContactDepth.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9
 10namespace FixedMathSharp.Geometry;
 11
 12/// <summary>Borrowed exact capsule/prism depth from a support projection or certified closest pair.</summary>
 13internal readonly ref struct CapsulePrismContactDepth
 14{
 15    private readonly WideConvexPrismRelations.ProjectionDepth _projection;
 16    private readonly ContactQuadratic _distanceSquared, _distanceDenominator;
 17    private readonly Fixed64 _radius;
 18    private readonly bool _edge;
 19
 20    internal CapsulePrismContactDepth(in WideConvexPrismRelations.ProjectionDepth projection)
 21    {
 7622        this = default; _projection = projection;
 23        System.Diagnostics.Debug.Assert(projection.RadialKind == WideConvexPrismRelations.RadialKind.Capsule);
 3824    }
 25    internal CapsulePrismContactDepth(ContactQuadratic distanceSquared, ContactQuadratic denominator, Fixed64 radius)
 133826    { this = default; _edge = true; _distanceSquared = distanceSquared; _distanceDenominator = denominator; _radius = ra
 27
 28    internal int Compare(scoped in CapsulePlaneRaySelection ray, in CapsulePlaneRayFrame frame)
 29    {
 1830        int qWords = _edge ? ContactQuadratic.ActiveWords(_distanceSquared) : 0;
 1831        int dWords = _edge ? ContactQuadratic.ActiveWords(_distanceDenominator) : 0;
 32        // Projection P² needs <1409 bits; the remaining terms fit 24 words.
 33        // Closest-pair products retain their complete active rational banks.
 1834        int words = _edge ? Math.Max(qWords, dWords + 2) + 2 : 24;
 3635        Span<ulong> values = stackalloc ulong[16 * words], root = stackalloc ulong[_edge ? qWords + dWords : 9];
 1836        Span<int> signs = stackalloc int[16];
 3637        var n = ContactQuadratic.At(values, signs, 0, words); var d = ContactQuadratic.At(values, signs, 1, words);
 3638        var p = ContactQuadratic.At(values, signs, 2, words); var c = ContactQuadratic.At(values, signs, 3, words);
 3639        var a = ContactQuadratic.At(values, signs, 4, words); var t = ContactQuadratic.At(values, signs, 5, words);
 3640        var u = ContactQuadratic.At(values, signs, 6, words); var v = ContactQuadratic.At(values, signs, 7, words);
 1841        root.Clear();
 1842        if (_edge)
 43        {
 44            // (R-sqrt(Q/D))² = (R²D+Q-2R*sqrt(QD))/D.
 1645            _distanceSquared.CopyTo(n); _distanceDenominator.CopyTo(d);
 846            p.Set(Signed832.ExtendValue(Signed192.Raw(_radius)));
 847            ContactQuadratic.Multiply(p, p, ReadOnlySpan<ulong>.Empty, t);
 1648            ContactQuadratic.Multiply(t, d, ReadOnlySpan<ulong>.Empty, u); n.Add(u);
 2449            p.CopyTo(t); t.Add(t); t.Rational[..WideArithmetic.GetActiveMagnitudeLength(t.Rational)].CopyTo(n.Radical);
 850            n.Signs[1] = -t.Signs[0];
 851            WideArithmetic.MultiplyMagnitudes(_distanceSquared.Rational[..qWords], _distanceDenominator.Rational[..dWord
 52        }
 53        else
 54        {
 55            // (R+P/(C*sqrt(A)))² retains C: ray and support charts need not share it.
 2056            p.Set(Signed832.ExtendValue(_projection.Rational)); c.Set(Signed576.ExtendValue(_projection.Common));
 1057            a.Set(_projection.AxisSquared);
 1058            ContactQuadratic.Scale(c, Signed576.ExtendValue(Signed192.Raw(_projection.Radius)), t);
 1059            ContactQuadratic.Multiply(p, p, ReadOnlySpan<ulong>.Empty, n);
 1060            ContactQuadratic.Multiply(t, t, ReadOnlySpan<ulong>.Empty, u);
 2061            ContactQuadratic.Multiply(u, a, ReadOnlySpan<ulong>.Empty, v); n.Add(v);
 2062            ContactQuadratic.Multiply(p, t, ReadOnlySpan<ulong>.Empty, u); u.Add(u);
 2063            u.Rational[..WideArithmetic.GetActiveMagnitudeLength(u.Rational)].CopyTo(n.Radical); n.Signs[1] = u.Signs[0]
 1064            ContactQuadratic.Multiply(c, c, ReadOnlySpan<ulong>.Empty, u);
 1065            ContactQuadratic.Multiply(u, a, ReadOnlySpan<ulong>.Empty, d);
 1066            WideArithmetic.GetMagnitude(_projection.AxisSquared, root);
 67        }
 1868        return ray.CompareSquaredDepth(frame, n, d, root);
 69    }
 70}