Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/MegaNearestPointTest.cs
2026-02-21 16:45:37 +08:00

278 lines
5.8 KiB
C#

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