public bool ClosestPtPointTetrahedron(TSVector p, TSVector a, TSVector b, TSVector c, TSVector d, ref SubSimplexClosestResult finalResult)
        {
            this.tempResult.Reset();
            finalResult.ClosestPointOnSimplex = p;
            finalResult.UsedVertices.Reset();
            finalResult.UsedVertices.UsedVertexA = true;
            finalResult.UsedVertices.UsedVertexB = true;
            finalResult.UsedVertices.UsedVertexC = true;
            finalResult.UsedVertices.UsedVertexD = true;
            int  num  = this.PointOutsideOfPlane(p, a, b, c, d);
            int  num2 = this.PointOutsideOfPlane(p, a, c, d, b);
            int  num3 = this.PointOutsideOfPlane(p, a, d, b, c);
            int  num4 = this.PointOutsideOfPlane(p, b, d, c, a);
            bool flag = num < 0 || num2 < 0 || num3 < 0 || num4 < 0;
            bool result;

            if (flag)
            {
                finalResult.Degenerate = true;
                result = false;
            }
            else
            {
                bool flag2 = num == 0 && num2 == 0 && num3 == 0 && num4 == 0;
                if (flag2)
                {
                    result = false;
                }
                else
                {
                    FP   y     = FP.MaxValue;
                    bool flag3 = num != 0;
                    if (flag3)
                    {
                        this.ClosestPtPointTriangle(p, a, b, c, ref this.tempResult);
                        TSVector closestPointOnSimplex = this.tempResult.ClosestPointOnSimplex;
                        FP       sqrMagnitude          = (closestPointOnSimplex - p).sqrMagnitude;
                        bool     flag4 = sqrMagnitude < y;
                        if (flag4)
                        {
                            y = sqrMagnitude;
                            finalResult.ClosestPointOnSimplex = closestPointOnSimplex;
                            finalResult.UsedVertices.Reset();
                            finalResult.UsedVertices.UsedVertexA = this.tempResult.UsedVertices.UsedVertexA;
                            finalResult.UsedVertices.UsedVertexB = this.tempResult.UsedVertices.UsedVertexB;
                            finalResult.UsedVertices.UsedVertexC = this.tempResult.UsedVertices.UsedVertexC;
                            finalResult.SetBarycentricCoordinates(this.tempResult.BarycentricCoords[0], this.tempResult.BarycentricCoords[1], this.tempResult.BarycentricCoords[2], 0);
                        }
                    }
                    bool flag5 = num2 != 0;
                    if (flag5)
                    {
                        this.ClosestPtPointTriangle(p, a, c, d, ref this.tempResult);
                        TSVector closestPointOnSimplex2 = this.tempResult.ClosestPointOnSimplex;
                        FP       sqrMagnitude2          = (closestPointOnSimplex2 - p).sqrMagnitude;
                        bool     flag6 = sqrMagnitude2 < y;
                        if (flag6)
                        {
                            y = sqrMagnitude2;
                            finalResult.ClosestPointOnSimplex = closestPointOnSimplex2;
                            finalResult.UsedVertices.Reset();
                            finalResult.UsedVertices.UsedVertexA = this.tempResult.UsedVertices.UsedVertexA;
                            finalResult.UsedVertices.UsedVertexC = this.tempResult.UsedVertices.UsedVertexB;
                            finalResult.UsedVertices.UsedVertexD = this.tempResult.UsedVertices.UsedVertexC;
                            finalResult.SetBarycentricCoordinates(this.tempResult.BarycentricCoords[0], 0, this.tempResult.BarycentricCoords[1], this.tempResult.BarycentricCoords[2]);
                        }
                    }
                    bool flag7 = num3 != 0;
                    if (flag7)
                    {
                        this.ClosestPtPointTriangle(p, a, d, b, ref this.tempResult);
                        TSVector closestPointOnSimplex3 = this.tempResult.ClosestPointOnSimplex;
                        FP       sqrMagnitude3          = (closestPointOnSimplex3 - p).sqrMagnitude;
                        bool     flag8 = sqrMagnitude3 < y;
                        if (flag8)
                        {
                            y = sqrMagnitude3;
                            finalResult.ClosestPointOnSimplex = closestPointOnSimplex3;
                            finalResult.UsedVertices.Reset();
                            finalResult.UsedVertices.UsedVertexA = this.tempResult.UsedVertices.UsedVertexA;
                            finalResult.UsedVertices.UsedVertexD = this.tempResult.UsedVertices.UsedVertexB;
                            finalResult.UsedVertices.UsedVertexB = this.tempResult.UsedVertices.UsedVertexC;
                            finalResult.SetBarycentricCoordinates(this.tempResult.BarycentricCoords[0], this.tempResult.BarycentricCoords[2], 0, this.tempResult.BarycentricCoords[1]);
                        }
                    }
                    bool flag9 = num4 != 0;
                    if (flag9)
                    {
                        this.ClosestPtPointTriangle(p, b, d, c, ref this.tempResult);
                        TSVector closestPointOnSimplex4 = this.tempResult.ClosestPointOnSimplex;
                        FP       sqrMagnitude4          = (closestPointOnSimplex4 - p).sqrMagnitude;
                        bool     flag10 = sqrMagnitude4 < y;
                        if (flag10)
                        {
                            finalResult.ClosestPointOnSimplex = closestPointOnSimplex4;
                            finalResult.UsedVertices.Reset();
                            finalResult.UsedVertices.UsedVertexB = this.tempResult.UsedVertices.UsedVertexA;
                            finalResult.UsedVertices.UsedVertexD = this.tempResult.UsedVertices.UsedVertexB;
                            finalResult.UsedVertices.UsedVertexC = this.tempResult.UsedVertices.UsedVertexC;
                            finalResult.SetBarycentricCoordinates(0, this.tempResult.BarycentricCoords[0], this.tempResult.BarycentricCoords[2], this.tempResult.BarycentricCoords[1]);
                        }
                    }
                    bool flag11 = finalResult.UsedVertices.UsedVertexA && finalResult.UsedVertices.UsedVertexB && finalResult.UsedVertices.UsedVertexC && finalResult.UsedVertices.UsedVertexD;
                    result = (!flag11 || true);
                }
            }
            return(result);
        }
        public bool ClosestPtPointTriangle(TSVector p, TSVector a, TSVector b, TSVector c, ref SubSimplexClosestResult result)
        {
            result.UsedVertices.Reset();
            TSVector tSVector  = b - a;
            TSVector tSVector2 = c - a;
            TSVector vector    = p - a;
            FP       x         = TSVector.Dot(tSVector, vector);
            FP       fP        = TSVector.Dot(tSVector2, vector);
            bool     flag      = x <= FP.Zero && fP <= FP.Zero;
            bool     result2;

            if (flag)
            {
                result.ClosestPointOnSimplex    = a;
                result.UsedVertices.UsedVertexA = true;
                result.SetBarycentricCoordinates(1, 0, 0, 0);
                result2 = true;
            }
            else
            {
                TSVector vector2 = p - b;
                FP       fP2     = TSVector.Dot(tSVector, vector2);
                FP       fP3     = TSVector.Dot(tSVector2, vector2);
                bool     flag2   = fP2 >= FP.Zero && fP3 <= fP2;
                if (flag2)
                {
                    result.ClosestPointOnSimplex    = b;
                    result.UsedVertices.UsedVertexB = true;
                    result.SetBarycentricCoordinates(0, 1, 0, 0);
                    result2 = true;
                }
                else
                {
                    FP   fP4   = x * fP3 - fP2 * fP;
                    bool flag3 = fP4 <= FP.Zero && x >= FP.Zero && fP2 <= FP.Zero;
                    if (flag3)
                    {
                        FP fP5 = x / (x - fP2);
                        result.ClosestPointOnSimplex    = a + fP5 * tSVector;
                        result.UsedVertices.UsedVertexA = true;
                        result.UsedVertices.UsedVertexB = true;
                        result.SetBarycentricCoordinates(1 - fP5, fP5, 0, 0);
                        result2 = true;
                    }
                    else
                    {
                        TSVector vector3 = p - c;
                        FP       x2      = TSVector.Dot(tSVector, vector3);
                        FP       fP6     = TSVector.Dot(tSVector2, vector3);
                        bool     flag4   = fP6 >= FP.Zero && x2 <= fP6;
                        if (flag4)
                        {
                            result.ClosestPointOnSimplex    = c;
                            result.UsedVertices.UsedVertexC = true;
                            result.SetBarycentricCoordinates(0, 0, 1, 0);
                            result2 = true;
                        }
                        else
                        {
                            FP   fP7   = x2 * fP - x * fP6;
                            bool flag5 = fP7 <= FP.Zero && fP >= FP.Zero && fP6 <= FP.Zero;
                            if (flag5)
                            {
                                FP fP8 = fP / (fP - fP6);
                                result.ClosestPointOnSimplex    = a + fP8 * tSVector2;
                                result.UsedVertices.UsedVertexA = true;
                                result.UsedVertices.UsedVertexC = true;
                                result.SetBarycentricCoordinates(1 - fP8, 0, fP8, 0);
                                result2 = true;
                            }
                            else
                            {
                                FP   x3    = fP2 * fP6 - x2 * fP3;
                                bool flag6 = x3 <= FP.Zero && fP3 - fP2 >= FP.Zero && x2 - fP6 >= FP.Zero;
                                if (flag6)
                                {
                                    FP fP8 = (fP3 - fP2) / (fP3 - fP2 + (x2 - fP6));
                                    result.ClosestPointOnSimplex    = b + fP8 * (c - b);
                                    result.UsedVertices.UsedVertexB = true;
                                    result.UsedVertices.UsedVertexC = true;
                                    result.SetBarycentricCoordinates(0, 1 - fP8, fP8, 0);
                                    result2 = true;
                                }
                                else
                                {
                                    FP y   = FP.One / (x3 + fP7 + fP4);
                                    FP fP5 = fP7 * y;
                                    FP fP8 = fP4 * y;
                                    result.ClosestPointOnSimplex    = a + tSVector * fP5 + tSVector2 * fP8;
                                    result.UsedVertices.UsedVertexA = true;
                                    result.UsedVertices.UsedVertexB = true;
                                    result.UsedVertices.UsedVertexC = true;
                                    result.SetBarycentricCoordinates(1 - fP5 - fP8, fP5, fP8, 0);
                                    result2 = true;
                                }
                            }
                        }
                    }
                }
            }
            return(result2);
        }