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;
}