BEPUphysics.CollisionShapes.MobileMeshShape.ComputeSolidSidednessHelper C# (CSharp) Метод

ComputeSolidSidednessHelper() приватный Метод

private ComputeSolidSidednessHelper ( Ray ray ) : TriangleSidedness
ray Ray
Результат TriangleSidedness
        TriangleSidedness ComputeSolidSidednessHelper(Ray ray)
        {
            TriangleSidedness toReturn;
            var hitList = CommonResources.GetIntList();
            if (triangleMesh.Tree.GetOverlaps(ray, hitList))
            {
                Vector3 vA, vB, vC;
                var hits = CommonResources.GetRayHitList();
                //Identify the first and last hits.
                int minimum = 0;
                int maximum = 0;
                float minimumT = float.MaxValue;
                float maximumT = -1;
                for (int i = 0; i < hitList.Count; i++)
                {
                    triangleMesh.Data.GetTriangle(hitList[i], out vA, out vB, out vC);
                    RayHit hit;
                    if (Toolbox.FindRayTriangleIntersection(ref ray, float.MaxValue, TriangleSidedness.DoubleSided, ref vA, ref vB, ref vC, out hit) &&
                        IsHitUnique(hits, ref hit))
                    {
                        if (hit.T < minimumT)
                        {
                            minimumT = hit.T;
                            minimum = hitList[i];
                        }
                        if (hit.T > maximumT)
                        {
                            maximumT = hit.T;
                            maximum = hitList[i];
                        }
                    }
                }

                if (hits.Count % 2 == 0)
                {
                    //Since we were outside, the first hit triangle should be calibrated
                    //such that it faces towards us.

                    triangleMesh.Data.GetTriangle(minimum, out vA, out vB, out vC);
                    var normal = Vector3.Cross(vA - vB, vA - vC);
                    if (Vector3.Dot(normal, ray.Direction) < 0)
                        toReturn = TriangleSidedness.Clockwise;
                    else
                        toReturn = TriangleSidedness.Counterclockwise;
                }
                else
                {
                    //Since we were inside, the last hit triangle should be calibrated
                    //such that it faces away from us.

                    triangleMesh.Data.GetTriangle(maximum, out vA, out vB, out vC);
                    var normal = Vector3.Cross(vA - vB, vA - vC);
                    if (Vector3.Dot(normal, ray.Direction) < 0)
                        toReturn = TriangleSidedness.Counterclockwise;
                    else
                        toReturn = TriangleSidedness.Clockwise;
                }

                CommonResources.GiveBack(hits);

            }
            else
                toReturn = TriangleSidedness.DoubleSided; //This is a problem...
            CommonResources.GiveBack(hitList);
            return toReturn;
        }