public static object IntersectRayTriangle(Ray ray, Vector3 v0, Vector3 v1, Vector3 v2, bool bidirectional)
{
Vector3 lhs = v1 - v0;
Vector3 rhs = v2 - v0;
Vector3 vector3 = Vector3.Cross(lhs, rhs);
float num = Vector3.Dot(-ray.direction, vector3);
if (num <= 0f)
{
return null;
}
Vector3 vector4 = ray.origin - v0;
float num2 = Vector3.Dot(vector4, vector3);
if ((num2 < 0f) && !bidirectional)
{
return null;
}
Vector3 vector5 = Vector3.Cross(-ray.direction, vector4);
float y = Vector3.Dot(rhs, vector5);
if ((y < 0f) || (y > num))
{
return null;
}
float z = -Vector3.Dot(lhs, vector5);
if ((z < 0f) || ((y + z) > num))
{
return null;
}
float num5 = 1f / num;
num2 *= num5;
y *= num5;
z *= num5;
float x = (1f - y) - z;
return new RaycastHit {
point = ray.origin + ((Vector3) (num2 * ray.direction)),
distance = num2,
barycentricCoordinate = new Vector3(x, y, z),
normal = Vector3.Normalize(vector3)
};
}