< Summary

Information
Class: FixedMathSharp.Geometry.TriangleCylinderEdgeContacts
Assembly: FixedMathSharp
File(s): /home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Triangles/TriangleCylinderEdgeContacts.cs
Line coverage
100%
Covered lines: 187
Uncovered lines: 0
Coverable lines: 187
Total lines: 326
Line coverage: 100%
Branch coverage
100%
Covered branches: 112
Total branches: 112
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
TryGetContact(...)100%1010100%
TryKeepContacts(...)100%2626100%
TryCharts(...)100%1212100%
IsChartAdmitted(...)100%1414100%
TryChart(...)100%3838100%
BuildParameter(...)100%11100%
WriteAdmission(...)100%66100%
GetMaterials(...)100%22100%
Restore(...)100%11100%
SupportsHull(...)100%44100%

File(s)

/home/runner/work/FixedMathSharp/FixedMathSharp/src/FixedMathSharp/Geometry/Wide/Triangles/TriangleCylinderEdgeContacts.cs

#LineLine coverage
 1//=======================================================================
 2// TriangleCylinderEdgeContacts.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;
 9using System.Runtime.CompilerServices;
 10using static FixedMathSharp.Geometry.CylinderContactAlgebra;
 11using static FixedMathSharp.Geometry.CircularRimContactAlgebra;
 12
 13namespace FixedMathSharp.Geometry;
 14
 15/// <summary>Every admitted triangle-edge/cylinder-rim stationary support root.</summary>
 16internal static partial class TriangleCylinderEdgeContacts
 17{
 18    private const int ParameterSlots = 30;
 19    private const int ValueCellWords = (16 * (ValueWords * 64 + 11) + 255) / 64;
 20
 21
 22
 23    internal static bool TryGetContact(in TriangleCircularGeometry geometry, in WideDirection3d coreOffset, in WideDirec
 24        Vector2d coreDirection, Fixed64 coreLength, FixedTriangle triangle,
 25        in ConvexContactCandidate analytic, Fixed64 analyticDepth, bool analyticClamped, Fixed64 radius, out bool hasBet
 26        out Vector3d radialPoint, out Vector3d trianglePoint, out Fixed64 depth, out bool clamped,
 27        out int mask, out int cap, out int coreSign, out int integralRadialMask, out bool strictOverlap, bool materializ
 28    {
 25329        int ValueWords = geometry.ValueWords;
 25330        int ValueCellWords = (16 * (geometry.ValueWords * 64 + 11) + 255) / 64;
 75931        hasBetter = false; normal = radialPoint = trianglePoint = default; depth = default;
 50632        clamped = false; mask = cap = coreSign = 0;
 50633        integralRadialMask = 5; strictOverlap = analytic.GapSign > 0;
 25334        Span<ulong> bestValues = stackalloc ulong[5 * ValueWords];
 25335        Span<sbyte> bestSigns = stackalloc sbyte[5];
 25336        Span<ulong> bestCell = stackalloc ulong[ValueCellWords];
 25337        Selection best = default;
 25338        if (!TryKeepContacts(geometry, coreOffset, coreAxis, analytic, analyticDepth, analyticClamped,
 26039                bestValues, bestSigns, bestCell, ref best)) return false;
 24640        if (!best.HasValue)
 17041            return true;
 7642        strictOverlap = !best.IsZero;
 8143        if (!materialize) return true;
 28444        hasBetter = true; mask = (1 << best.Edge) | (1 << ((best.Edge + 1) % 3)); cap = best.Cap; coreSign = best.CoreSi
 45        TriangleCircularGeometry winnerStorage;
 7146        scoped ref readonly TriangleCircularGeometry winner = ref geometry;
 7147        if (coreSign != 0)
 48        {
 2949            winnerStorage = geometry.AtCoreRegion(coreOffset, coreSign);
 2950            winner = ref winnerStorage;
 51        }
 7152        GetMaterials(winner, coreAxis, coreDirection, coreLength, triangle, best, radius,
 7153            out normal, out radialPoint, out trianglePoint, out integralRadialMask);
 7154        if (!best.IsZero)
 55        {
 5556            FiniteAxisValueRoot root = Restore(bestValues, bestSigns, bestCell, best);
 5557            ConvexContactValueRoot.GetRoundedDepth(geometry.RawScale, geometry.ValueShift,
 5558                ref root, out depth, out clamped);
 59        }
 7160        return true;
 61    }
 62
 63    internal static bool TryKeepContacts(in TriangleCircularGeometry geometry, in WideDirection3d coreOffset, in WideDir
 64        in ConvexContactCandidate analytic, Fixed64 analyticDepth, bool analyticClamped,
 65        scoped Span<ulong> bestValues, scoped Span<sbyte> bestSigns, scoped Span<ulong> bestCell, ref Selection best,
 66        in CylinderHullSupport hull = default, int triangleIndex = 0)
 67    {
 161868        int regionStart = coreAxis.IsZero ? 0 : -1;
 719269        for (int region = regionStart; region <= (coreAxis.IsZero ? 0 : 1); region += 2)
 70        {
 71            TriangleCircularGeometry endpointStorage;
 198672            scoped ref readonly TriangleCircularGeometry endpoint = ref geometry;
 198673            if (region != 0)
 74            {
 73775                endpointStorage = geometry.AtCoreRegion(coreOffset, region);
 73776                endpoint = ref endpointStorage;
 77            }
 1585278            for (int edge = 0; edge < 3; edge++)
 79            {
 594880                WideDirection3d e = endpoint.Edge(edge);
 81                // Parallel edges project a circle; perpendicular edges project a
 82                // line segment. Their extrema are already analytic fan boundaries.
 594883                if (e.Y.IsZero || e.X.IsZero && e.Z.IsZero)
 84                    continue;
 410585                GetBasis(e, out WideDirection3d u, out WideDirection3d v);
 2460886                for (int firstSign = -1; firstSign <= 1; firstSign += 2)
 4921887                    for (int secondSign = -1; secondSign <= 1; secondSign += 2)
 9843288                        for (int capSign = -1; capSign <= 1; capSign += 2)
 89                        {
 3281490                            WideDirection3d first = firstSign > 0 ? u : -u;
 3281491                            WideDirection3d second = secondSign > 0 ? v : -v;
 3281492                            if (!TryCharts(endpoint, coreAxis, region, edge, first, second, capSign, analytic,
 3281493                                    ((ulong)analyticDepth.m_rawValue << 1) | 1UL, !analyticClamped,
 3281494                                    bestValues, bestSigns, bestCell, ref best, hull, triangleIndex))
 895                                return false;
 96                        }
 97            }
 98        }
 161099        return true;
 100    }
 101
 102    [MethodImpl(MethodImplOptions.NoInlining)]
 103    private static bool TryCharts(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis, int region, int edg
 104        in WideDirection3d originalFirst, in WideDirection3d originalSecond, int cap, scoped ConvexContactCandidate anal
 105        ulong upperTwiceRaw, bool hasUpperBound,
 106        scoped Span<ulong> bestValues, scoped Span<sbyte> bestSigns, scoped Span<ulong> bestCell,
 107        ref Selection best, in CylinderHullSupport hull, int triangleIndex)
 108    {
 32814109        int Words = geometry.ParameterWords;
 32814110        scoped ref readonly WideDirection3d first = ref originalFirst;
 32814111        scoped ref readonly WideDirection3d second = ref originalSecond;
 32814112        bool firstAdmitted = IsChartAdmitted(geometry, coreAxis, region, edge, first, second, cap);
 32814113        bool secondAdmitted = IsChartAdmitted(geometry, coreAxis, region, edge, second, first, cap);
 55370114        if (!firstAdmitted && !secondAdmitted) return true;
 10258115        if (!firstAdmitted)
 116        {
 1782117            first = ref originalSecond;
 1782118            second = ref originalFirst;
 119        }
 10258120        Span<ulong> data = stackalloc ulong[ParameterSlots * Words];
 10258121        Span<sbyte> signs = stackalloc sbyte[ParameterSlots];
 10258122        BuildParameter(geometry, coreAxis, region, edge, first, second, cap, data, signs);
 10258123        if (!TryChart(geometry, coreAxis, region, edge, first, second, cap, analytic, upperTwiceRaw, hasUpperBound,
 10262124                data, signs, bestValues, bestSigns, bestCell, ref best, hull, triangleIndex)) return false;
 13385125        if (!firstAdmitted || !secondAdmitted) return true;
 126        // Finish the first chart before mutation; winners already own copied
 127        // value algebra. Preserve its earlier canonical rank when depths tie.
 7123128        ReverseParameterChart(data, signs);
 7123129        WriteAdmission(geometry, coreAxis, region, edge, second, first, data, signs);
 7123130        return TryChart(geometry, coreAxis, region, edge, second, first, cap, analytic, upperTwiceRaw, hasUpperBound,
 7123131            data, signs, bestValues, bestSigns, bestCell, ref best, hull, triangleIndex);
 132    }
 133
 134    private static bool IsChartAdmitted(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis, int region, i
 135        in WideDirection3d first, in WideDirection3d second, int cap)
 136    {
 137
 138        // Each admission projection is affine on t in (0,1] and must be
 139        // positive. Nonpositive endpoints exclude every root before construction.
 140        // GetBasis gives exactly one nonzero Y component. Its cap projection
 141        // cannot change sign inside this chart, so this check fully admits it.
 65628142        if (first.Y.Sign * cap <= 0 && WideArithmetic.AddSigned576(first.Y, second.Y).Sign * cap <= 0)
 32808143            return false;
 32820144        WideDirection3d outward = TriangleCircularGeometry.Subtract(geometry.Vertex(edge), geometry.Vertex((edge + 2) % 
 65640145        Signed832 firstCone = WideDirection3d.Dot(first, outward), secondCone = WideDirection3d.Dot(second, outward);
 32820146        if (firstCone.Sign <= 0 && WideArithmetic.AddSigned832(firstCone, secondCone).Sign <= 0)
 13543147            return false;
 19277148        if (!coreAxis.IsZero)
 149        {
 8742150            Signed832 firstCore = WideDirection3d.Dot(coreAxis, first), secondCore = WideDirection3d.Dot(coreAxis, secon
 4371151            if (firstCore.Sign * region <= 0 && WideArithmetic.AddSigned832(firstCore, secondCore).Sign * region <= 0)
 1892152                return false;
 153        }
 17385154        return true;
 155    }
 156
 157    [MethodImpl(MethodImplOptions.NoInlining)]
 158    private static bool TryChart(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis, int region, int edge
 159        in WideDirection3d first, in WideDirection3d second, int cap, scoped ConvexContactCandidate analytic,
 160        ulong upperTwiceRaw, bool hasUpperBound, scoped Span<ulong> data, scoped Span<sbyte> signs,
 161        scoped Span<ulong> bestValues, scoped Span<sbyte> bestSigns, scoped Span<ulong> bestCell,
 162        ref Selection best, in CylinderHullSupport hull, int triangleIndex)
 163    {
 17381164        int Words = geometry.ParameterWords;
 17381165        int ValueWords = geometry.ValueWords;
 17381166        int ValueCellWords = (16 * (geometry.ValueWords * 64 + 11) + 255) / 64;
 17381167        Span<ulong> batchCells = stackalloc ulong[64];
 17381168        Span<int> batchShifts = stackalloc int[8];
 17381169        FiniteAxisValueRoots roots = WideFiniteAxisIntersection.GetFiniteValueRoots(
 17381170            data[..(5 * Words)], signs[..5], batchCells, batchShifts);
 17381171        Span<ulong> cell = stackalloc ulong[WideFiniteAxisIntersection.GetFiniteValueRootCellWords(
 17381172            data[..(5 * Words)], signs[..5])];
 17381173        Span<ulong> values = stackalloc ulong[5 * ValueWords];
 17381174        Span<sbyte> valueSigns = stackalloc sbyte[5];
 17381175        Span<ulong> valueCell = stackalloc ulong[ValueCellWords];
 17381176        bool valuesReady = false;
 55744177        for (int ordinal = 0; ordinal < roots.Count; ordinal++)
 178        {
 10499179            scoped FiniteAxisValueRoot root = FiniteAxisValueRoots.GetRoot(roots, ordinal,
 10499180                data[..(5 * Words)], signs[..5], cell);
 181            // Zero third-vertex alignment is the already-ranked face normal;
 182            // this boundary cannot improve that earlier canonical feature.
 10499183            if (Sign(ref root, data, signs, 26, 2) <= 0)
 184                continue;
 8448185            if (!hull.IsEmpty && !SupportsHull(hull, geometry, geometry.Vertex(edge), first, second, ref root))
 186                continue;
 187            // Boundary roots belong to the explicit seam fan. Reject the
 188            // opposite endpoint's hemisphere before sign rejection or ranking.
 5106189            if (!coreAxis.IsZero && Sign(ref root, data, signs, 28, 2) <= 0)
 190                continue;
 5004191            int kSign = Sign(ref root, data, signs, 8, 2);
 5004192            if (kSign == 0 || Sign(ref root, data, signs, 10, 3) != -kSign)
 193                continue;
 2588194            int gapSign = Sign(ref root, data, signs, 13, 3) * kSign;
 2588195            if (gapSign < 0)
 8196                return false;
 2580197            if (!hull.IsEmpty && !TriangleCylinderRimWitnesses.IsRootPointOnEdge(geometry, edge, first, second, ref root
 198                continue;
 2406199            if (best.IsZero || analytic.GapSign == 0)
 200                continue;
 2310201            var candidate = new Selection
 2310202            {
 2310203                HasValue = true,
 2310204                First = first,
 2310205                Second = second,
 2310206                Edge = edge,
 2310207                Cap = cap,
 2310208                CoreSign = region,
 2310209                ParameterOrdinal = ordinal,
 2310210                Triangle = triangleIndex
 2310211            };
 2310212            if (gapSign == 0)
 213            {
 34214                candidate.IsZero = true; best = candidate;
 17215                continue;
 216            }
 217            // The unclamped analytic depth d bounds its exact gap by d+1/2 raw.
 218            // Reject positive roots at or above that bound before value mapping;
 219            // admitted negative and zero gaps have already retained their semantics.
 2293220            if (hasUpperBound && ConvexContactValueRoot.CompareSquaredGapToTwiceRaw(ref root,
 2293221                    data.Slice(16 * Words, 5 * Words), signs.Slice(16, 5),
 2293222                    data.Slice(21 * Words, 5 * Words), signs.Slice(21, 5), upperTwiceRaw) >= 0)
 223                continue;
 116224            if (!valuesReady)
 225            {
 115226                BuildValues(geometry.Edge(edge), geometry.CapOffset(edge, cap), geometry.Radius, geometry.ValueShift, va
 115227                valuesReady = true;
 228            }
 116229            scoped FiniteAxisValueRoot value = ConvexContactValueRoot.MapSquaredValue(
 116230                geometry.RawScale, geometry.ValueShift, ref root,
 116231                data.Slice(16 * Words, 5 * Words), signs.Slice(16, 5),
 116232                data.Slice(21 * Words, 5 * Words), signs.Slice(21, 5),
 116233                values, valueSigns, valueCell);
 116234            int comparison = best.HasValue
 116235                ? WideFiniteAxisIntersection.CompareFiniteValueRoots(value, Restore(bestValues, bestSigns, bestCell, bes
 116236                : ConvexContactValueRoot.CompareRootSquared(geometry.RawScale, geometry.ValueShift, ref value, analytic)
 116237            if (comparison >= 0)
 238                continue;
 231239            values.CopyTo(bestValues); valueSigns.CopyTo(bestSigns); valueCell.CopyTo(bestCell);
 154240            candidate.ValueOrdinal = value.Ordinal; candidate.ValueShift = value.DenominatorShift;
 154241            candidate.IsRational = value.IsRational; best = candidate;
 242        }
 17373243        return true;
 244    }
 245
 246    private static void BuildParameter(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis, int region, in
 247        in WideDirection3d first, in WideDirection3d second, int cap, Span<ulong> data, Span<sbyte> signs)
 248    {
 249
 10347250        CircularRimContactAlgebra.BuildParameter(geometry.CapOffset(edge, cap), geometry.Radius, geometry.RawScale,
 10347251            first, second, data, signs, useRigidBounds: !geometry.IsAffine);
 10347252        WriteAdmission(geometry, coreAxis, region, edge, first, second, data, signs);
 10347253    }
 254
 255    private static void WriteAdmission(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis, int region, in
 256        in WideDirection3d first, in WideDirection3d second, Span<ulong> data, Span<sbyte> signs)
 257    {
 258
 17470259        WideDirection3d outward = TriangleCircularGeometry.Subtract(geometry.Vertex(edge), geometry.Vertex((edge + 2) % 
 17470260        Write(data, signs, 26, WideDirection3d.Dot(outward, first));
 17470261        Write(data, signs, 27, WideDirection3d.Dot(outward, second));
 17470262        if (!coreAxis.IsZero)
 263        {
 5028264            Signed832 firstCore = WideDirection3d.Dot(coreAxis, first), secondCore = WideDirection3d.Dot(coreAxis, secon
 2514265            Write(data, signs, 28, region < 0 ? WideArithmetic.SubtractSigned832(default, firstCore) : firstCore);
 2514266            Write(data, signs, 29, region < 0 ? WideArithmetic.SubtractSigned832(default, secondCore) : secondCore);
 267        }
 17470268    }
 269
 270    [MethodImpl(MethodImplOptions.NoInlining)]
 271    internal static void GetMaterials(in TriangleCircularGeometry geometry, in WideDirection3d coreAxis,
 272        Vector2d coreDirection, Fixed64 coreLength, FixedTriangle triangle, in Selection best, Fixed64 radius,
 273        out Vector3d normal, out Vector3d radialPoint, out Vector3d trianglePoint, out int integralRadialMask)
 274    {
 89275        int Words = geometry.ParameterWords;
 89276        Span<ulong> data = stackalloc ulong[ParameterSlots * Words];
 89277        Span<sbyte> signs = stackalloc sbyte[ParameterSlots];
 89278        BuildParameter(geometry, coreAxis, best.CoreSign, best.Edge, best.First, best.Second, best.Cap, data, signs);
 89279        Span<ulong> cell = stackalloc ulong[WideFiniteAxisIntersection.GetFiniteValueRootCellWords(data[..(5 * Words)], 
 89280        bool found = WideFiniteAxisIntersection.TryGetFiniteValueRoot(data[..(5 * Words)], signs[..5],
 89281            best.ParameterOrdinal, cell, out FiniteAxisValueRoot root);
 282        System.Diagnostics.Debug.Assert(found);
 89283        trianglePoint = TriangleCylinderRimWitnesses.GetRootPoint(geometry, triangle, best.Edge, best.First, best.Second
 89284        Span<ulong> gradient = stackalloc ulong[54];
 89285        Span<sbyte> gradientSigns = stackalloc sbyte[6];
 89286        WriteGradient(best.First, best.Second, gradient, gradientSigns);
 178287        gradient.Slice(18, 18).Clear(); gradientSigns.Slice(2, 2).Clear();
 89288        radialPoint = ConvexContactValueRoot.GetScaledNormalizedDirection(ref root, gradient, gradientSigns, radius, -1)
 89289        integralRadialMask = 5;
 89290        if (best.CoreSign != 0)
 291        {
 36292            Vector3d core = TriangleCapsuleSlabEndpointWitnesses.GetCore(coreDirection, coreLength, best.CoreSign,
 36293                out FixedPointAnchorTerm3d term);
 36294            radialPoint = TriangleCapsuleSlabEndpointWitnesses.AdjustRoot(ref root, gradient, gradientSigns,
 36295                radius, core, term, radialPoint, out integralRadialMask);
 296        }
 89297        WriteGradient(Transform(geometry.WorldBasis, best.First), Transform(geometry.WorldBasis, best.Second), gradient,
 89298        normal = ConvexContactValueRoot.GetNormalizedDirection(ref root, gradient, gradientSigns, 1);
 89299    }
 300
 301    internal static FiniteAxisValueRoot Restore(ReadOnlySpan<ulong> values, ReadOnlySpan<sbyte> signs,
 93302        Span<ulong> cell, in Selection selection) => new()
 93303        {
 93304            Coefficients = values,
 93305            Signs = signs,
 93306            LowerNumerator = cell,
 93307            DenominatorShift = selection.ValueShift,
 93308            Ordinal = selection.ValueOrdinal,
 93309            IsRational = selection.IsRational
 93310        };
 311
 312    private static bool SupportsHull(in CylinderHullSupport hull, in TriangleCircularGeometry geometry, in WideDirection
 313        in WideDirection3d first, in WideDirection3d second, ref FiniteAxisValueRoot root)
 314    {
 13624315        Span<ulong> query = stackalloc ulong[26]; Span<sbyte> signs = stackalloc sbyte[2];
 82472316        for (int i = 0; i < hull.Count; i++)
 317        {
 37766318            WideDirection3d difference = TriangleCircularGeometry.Subtract(point, geometry.TransformHullVertex(hull.Vert
 75532319            Signed832 a = WideDirection3d.Dot(difference, first), b = WideDirection3d.Dot(difference, second);
 75532320            WideArithmetic.GetMagnitude(a, query[..13]); signs[0] = (sbyte)a.Sign;
 75532321            WideArithmetic.GetMagnitude(b, query[13..]); signs[1] = (sbyte)b.Sign;
 41108322            if (WideFiniteAxisIntersection.GetSignAtFiniteValueRootAndRefine(ref root, query, signs) < 0) return false;
 323        }
 3470324        return true;
 325    }
 326}

Methods/Properties

TryGetContact(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Geometry.ConvexContactCandidate&,FixedMathSharp.Fixed64,System.Boolean,FixedMathSharp.Fixed64,System.Boolean&,FixedMathSharp.Vector3d&,FixedMathSharp.Vector3d&,FixedMathSharp.Vector3d&,FixedMathSharp.Fixed64&,System.Boolean&,System.Int32&,System.Int32&,System.Int32&,System.Int32&,System.Boolean&,System.Boolean)
TryKeepContacts(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.ConvexContactCandidate&,FixedMathSharp.Fixed64,System.Boolean,System.Span`1<System.UInt64>,System.Span`1<System.SByte>,System.Span`1<System.UInt64>,FixedMathSharp.Geometry.TriangleCylinderEdgeContacts/Selection&,FixedMathSharp.Geometry.CylinderHullSupport&,System.Int32)
TryCharts(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Int32,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,FixedMathSharp.Geometry.ConvexContactCandidate,System.UInt64,System.Boolean,System.Span`1<System.UInt64>,System.Span`1<System.SByte>,System.Span`1<System.UInt64>,FixedMathSharp.Geometry.TriangleCylinderEdgeContacts/Selection&,FixedMathSharp.Geometry.CylinderHullSupport&,System.Int32)
IsChartAdmitted(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Int32,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32)
TryChart(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Int32,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,FixedMathSharp.Geometry.ConvexContactCandidate,System.UInt64,System.Boolean,System.Span`1<System.UInt64>,System.Span`1<System.SByte>,System.Span`1<System.UInt64>,System.Span`1<System.SByte>,System.Span`1<System.UInt64>,FixedMathSharp.Geometry.TriangleCylinderEdgeContacts/Selection&,FixedMathSharp.Geometry.CylinderHullSupport&,System.Int32)
BuildParameter(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Int32,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Span`1<System.UInt64>,System.Span`1<System.SByte>)
WriteAdmission(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,System.Int32,System.Int32,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,System.Span`1<System.UInt64>,System.Span`1<System.SByte>)
GetMaterials(FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Vector2d,FixedMathSharp.Fixed64,FixedMathSharp.Geometry.FixedTriangle,FixedMathSharp.Geometry.TriangleCylinderEdgeContacts/Selection&,FixedMathSharp.Fixed64,FixedMathSharp.Vector3d&,FixedMathSharp.Vector3d&,FixedMathSharp.Vector3d&,System.Int32&)
Restore(System.ReadOnlySpan`1<System.UInt64>,System.ReadOnlySpan`1<System.SByte>,System.Span`1<System.UInt64>,FixedMathSharp.Geometry.TriangleCylinderEdgeContacts/Selection&)
SupportsHull(FixedMathSharp.Geometry.CylinderHullSupport&,FixedMathSharp.Geometry.TriangleCircularGeometry&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.WideDirection3d&,FixedMathSharp.Geometry.FiniteAxisValueRoot&)