using UnityEngine; public class MegaNearestPointTest { private static Vector3 mTriangleBary = Vector3.zero; private static Vector3 mClosestPoint1 = Vector3.zero; public static Vector3 NearestPointOnMesh1(Vector3 pt, Vector3[] verts, int[] tri, ref int index, ref Vector3 bary) { float num = float.MaxValue; Vector3 zero = Vector3.zero; num = float.MaxValue; for (int i = 0; i < tri.Length; i += 3) { Vector3 v = verts[tri[i]]; Vector3 v2 = verts[tri[i + 1]]; Vector3 v3 = verts[tri[i + 2]]; float num2 = DistPoint3Triangle3Dbl(pt, v, v2, v3); float num3 = num2; if (num3 < num) { index = i; bary = mTriangleBary; zero = mClosestPoint1; num = num3; } } return zero; } public static Vector3 NearestPointOnMesh2(Vector3 pt, Vector3[] verts, int[] tri, ref int index, ref Vector3 bary) { float num = float.MaxValue; Vector3 zero = Vector3.zero; num = float.MaxValue; for (int i = 0; i < tri.Length; i += 3) { Vector3 v = verts[tri[i]]; Vector3 v2 = verts[tri[i + 1]]; Vector3 v3 = verts[tri[i + 2]]; float num2 = DistPoint3Triangle3Dbl(pt, v, v2, v3); float num3 = num2; if (num3 < num) { index = i; bary = mTriangleBary; zero = mClosestPoint1; num = num3; } } return zero; } public static float DistPoint3Triangle3Dbl(Vector3 mPoint, Vector3 v0, Vector3 v1, Vector3 v2) { Vector3 rhs = v0 - mPoint; Vector3 vector = v1 - v0; Vector3 lhs = v2 - v0; double num = vector.sqrMagnitude; double num2 = Vector3.Dot(lhs, vector); double num3 = lhs.sqrMagnitude; double num4 = Vector3.Dot(vector, rhs); double num5 = Vector3.Dot(lhs, rhs); double num6 = rhs.sqrMagnitude; double num7 = Mathf.Abs((float)num * (float)num3 - (float)num2 * (float)num2); double num8 = num2 * num5 - num3 * num4; double num9 = num2 * num4 - num * num5; double num10; if (num8 + num9 <= num7) { if (num8 < 0.0) { if (num9 < 0.0) { if (num4 < 0.0) { num9 = 0.0; if (0.0 - num4 >= num) { num8 = 1.0; num10 = num + 2.0 * num4 + num6; } else { num8 = (0.0 - num4) / num; num10 = num4 * num8 + num6; } } else { num8 = 0.0; if (num5 >= 0.0) { num9 = 0.0; num10 = num6; } else if (0.0 - num5 >= num3) { num9 = 1.0; num10 = num3 + 2.0 * num5 + num6; } else { num9 = (0.0 - num5) / num3; num10 = num5 * num9 + num6; } } } else { num8 = 0.0; if (num5 >= 0.0) { num9 = 0.0; num10 = num6; } else if (0.0 - num5 >= num3) { num9 = 1.0; num10 = num3 + 2.0 * num5 + num6; } else { num9 = (0.0 - num5) / num3; num10 = num5 * num9 + num6; } } } else if (num9 < 0.0) { num9 = 0.0; if (num4 >= 0.0) { num8 = 0.0; num10 = num6; } else if (0.0 - num4 >= num) { num8 = 1.0; num10 = num + 2.0 * num4 + num6; } else { num8 = (0.0 - num4) / num; num10 = num4 * num8 + num6; } } else { double num11 = 1.0 / num7; num8 *= num11; num9 *= num11; num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6; } } else if (num8 < 0.0) { double num12 = num2 + num4; double num13 = num3 + num5; if (num13 > num12) { double num14 = num13 - num12; double num15 = num - 2.0 * num2 + num3; if (num14 >= num15) { num8 = 1.0; num9 = 0.0; num10 = num + 2.0 * num4 + num6; } else { num8 = num14 / num15; num9 = 1.0 - num8; num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6; } } else { num8 = 0.0; if (num13 <= 0.0) { num9 = 1.0; num10 = num3 + 2.0 * num5 + num6; } else if (num5 >= 0.0) { num9 = 0.0; num10 = num6; } else { num9 = (0.0 - num5) / num3; num10 = num5 * num9 + num6; } } } else if (num9 < 0.0) { double num12 = num2 + num5; double num13 = num + num4; if (num13 > num12) { double num14 = num13 - num12; double num15 = num - 2.0 * num2 + num3; if (num14 >= num15) { num9 = 1.0; num8 = 0.0; num10 = num3 + 2.0 * num5 + num6; } else { num9 = num14 / num15; num8 = 1.0 - num9; num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6; } } else { num9 = 0.0; if (num13 <= 0.0) { num8 = 1.0; num10 = num + 2.0 * num4 + num6; } else if (num4 >= 0.0) { num8 = 0.0; num10 = num6; } else { num8 = (0.0 - num4) / num; num10 = num4 * num8 + num6; } } } else { double num14 = num3 + num5 - num2 - num4; if (num14 <= 0.0) { num8 = 0.0; num9 = 1.0; num10 = num3 + 2.0 * num5 + num6; } else { double num15 = num - 2.0 * num2 + num3; if (num14 >= num15) { num8 = 1.0; num9 = 0.0; num10 = num + 2.0 * num4 + num6; } else { num8 = num14 / num15; num9 = 1.0 - num8; num10 = num8 * (num * num8 + num2 * num9 + 2.0 * num4) + num9 * (num2 * num8 + num3 * num9 + 2.0 * num5) + num6; } } } if (num10 < 0.0) { num10 = 0.0; } mClosestPoint1.x = v0.x + (float)(num8 * (double)vector.x + num9 * (double)lhs.x); mClosestPoint1.y = v0.y + (float)(num8 * (double)vector.y + num9 * (double)lhs.y); mClosestPoint1.z = v0.z + (float)(num8 * (double)vector.z + num9 * (double)lhs.z); mTriangleBary[1] = (float)num8; mTriangleBary[2] = (float)num9; mTriangleBary[0] = (float)(1.0 - num8 - num9); return (float)num10; } }