UnityEditor.MathUtils.ClosestPtSegmentRay C# (CSharp) Method

ClosestPtSegmentRay() public static method

public static ClosestPtSegmentRay ( Vector3 p1, Vector3 q1, Ray ray, float &squaredDist, float &s, Vector3 &closestRay ) : Vector3
p1 Vector3
q1 Vector3
ray UnityEngine.Ray
squaredDist float
s float
closestRay Vector3
return Vector3
        public static Vector3 ClosestPtSegmentRay(Vector3 p1, Vector3 q1, Ray ray, out float squaredDist, out float s, out Vector3 closestRay)
        {
            Vector3 origin = ray.origin;
            Vector3 point = ray.GetPoint(10000f);
            Vector3 lhs = q1 - p1;
            Vector3 vector4 = point - origin;
            Vector3 rhs = p1 - origin;
            float num = Vector3.Dot(lhs, lhs);
            float num2 = Vector3.Dot(vector4, vector4);
            float num3 = Vector3.Dot(vector4, rhs);
            float num4 = 0f;
            if ((num <= Mathf.Epsilon) && (num2 <= Mathf.Epsilon))
            {
                squaredDist = Vector3.Dot(p1 - origin, p1 - origin);
                s = 0f;
                closestRay = origin;
                return p1;
            }
            if (num <= Mathf.Epsilon)
            {
                s = 0f;
                num4 = num3 / num2;
                num4 = Mathf.Clamp(num4, 0f, 1f);
            }
            else
            {
                float num5 = Vector3.Dot(lhs, rhs);
                if (num2 <= Mathf.Epsilon)
                {
                    num4 = 0f;
                    s = Mathf.Clamp((float) (-num5 / num), (float) 0f, (float) 1f);
                }
                else
                {
                    float num6 = Vector3.Dot(lhs, vector4);
                    float num7 = (num * num2) - (num6 * num6);
                    if (num7 != 0f)
                    {
                        s = Mathf.Clamp((float) (((num6 * num3) - (num5 * num2)) / num7), (float) 0f, (float) 1f);
                    }
                    else
                    {
                        s = 0f;
                    }
                    num4 = ((num6 * s) + num3) / num2;
                    if (num4 < 0f)
                    {
                        num4 = 0f;
                        s = Mathf.Clamp((float) (-num5 / num), (float) 0f, (float) 1f);
                    }
                    else if (num4 > 1f)
                    {
                        num4 = 1f;
                        s = Mathf.Clamp((float) ((num6 - num5) / num), (float) 0f, (float) 1f);
                    }
                }
            }
            Vector3 vector7 = p1 + (lhs * s);
            Vector3 vector8 = origin + ((Vector3) (vector4 * num4));
            squaredDist = Vector3.Dot(vector7 - vector8, vector7 - vector8);
            closestRay = vector8;
            return vector7;
        }