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

274 lines
5.4 KiB
C#

using UnityEngine;
internal static class AABB_Triangle_Intersection
{
private static void FINDMINMAX(float x0, float x1, float x2, out float min, out float max)
{
min = (max = x0);
if (x1 < min)
{
min = x1;
}
if (x1 > max)
{
max = x1;
}
if (x2 < min)
{
min = x2;
}
if (x2 > max)
{
max = x2;
}
}
private static bool planeBoxOverlap(Vector3 normal, Vector3 vert, Vector3 maxbox)
{
float x = vert.x;
Vector3 rhs = default(Vector3);
Vector3 rhs2 = default(Vector3);
if (normal.x > 0f)
{
rhs.x = 0f - maxbox.x - x;
rhs2.x = maxbox.x - x;
}
else
{
rhs.x = maxbox.x - x;
rhs2.x = 0f - maxbox.x - x;
}
x = vert.y;
if (normal.y > 0f)
{
rhs.y = 0f - maxbox.y - x;
rhs2.y = maxbox.y - x;
}
else
{
rhs.y = maxbox.y - x;
rhs2.y = 0f - maxbox.y - x;
}
x = vert.z;
if (normal.z > 0f)
{
rhs.z = 0f - maxbox.z - x;
rhs2.z = maxbox.z - x;
}
else
{
rhs.z = maxbox.z - x;
rhs2.z = 0f - maxbox.z - x;
}
if (Vector3.Dot(normal, rhs) > 0f)
{
return false;
}
if (Vector3.Dot(normal, rhs2) >= 0f)
{
return true;
}
return false;
}
public static bool TriangleBoxOverlap(Vector3 A, Vector3 B, Vector3 C, Bounds Box)
{
return triBoxOverlap(Box.center, Box.extents, new Vector3[3] { A, B, C });
}
private static bool triBoxOverlap(Vector3 boxcenter, Vector3 boxhalfsize, Vector3[] triverts)
{
Vector3 vector = triverts[0] - boxcenter;
Vector3 vector2 = triverts[1] - boxcenter;
Vector3 vector3 = triverts[2] - boxcenter;
Vector3 lhs = vector2 - vector;
Vector3 rhs = vector3 - vector2;
Vector3 vector4 = vector - vector3;
float num = Mathf.Abs(lhs.x);
float num2 = Mathf.Abs(lhs.y);
float num3 = Mathf.Abs(lhs.z);
float num4 = lhs.z * vector.y - lhs.y * vector.z;
float num5 = lhs.z * vector3.y - lhs.y * vector3.z;
float num6;
float num7;
if (num4 < num5)
{
num6 = num4;
num7 = num5;
}
else
{
num6 = num5;
num7 = num4;
}
float num8 = num3 * boxhalfsize.y + num2 * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num4 = (0f - lhs.z) * vector.x + lhs.x * vector.z;
num5 = (0f - lhs.z) * vector3.x + lhs.x * vector3.z;
if (num4 < num5)
{
num6 = num4;
num7 = num5;
}
else
{
num6 = num5;
num7 = num4;
}
num8 = num3 * boxhalfsize.x + num * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
float num9 = lhs.y * vector2.x - lhs.x * vector2.y;
num5 = lhs.y * vector3.x - lhs.x * vector3.y;
if (num5 < num9)
{
num6 = num5;
num7 = num9;
}
else
{
num6 = num9;
num7 = num5;
}
num8 = num2 * boxhalfsize.x + num * boxhalfsize.y;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num = Mathf.Abs(rhs.x);
num2 = Mathf.Abs(rhs.y);
num3 = Mathf.Abs(rhs.z);
num4 = rhs.z * vector.y - rhs.y * vector.z;
num5 = rhs.z * vector3.y - rhs.y * vector3.z;
if (num4 < num5)
{
num6 = num4;
num7 = num5;
}
else
{
num6 = num5;
num7 = num4;
}
num8 = num3 * boxhalfsize.y + num2 * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num4 = (0f - rhs.z) * vector.x + rhs.x * vector.z;
num5 = (0f - rhs.z) * vector3.x + rhs.x * vector3.z;
if (num4 < num5)
{
num6 = num4;
num7 = num5;
}
else
{
num6 = num5;
num7 = num4;
}
num8 = num3 * boxhalfsize.x + num * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num4 = rhs.y * vector.x - rhs.x * vector.y;
num9 = rhs.y * vector2.x - rhs.x * vector2.y;
if (num4 < num9)
{
num6 = num4;
num7 = num9;
}
else
{
num6 = num9;
num7 = num4;
}
num8 = num2 * boxhalfsize.x + num * boxhalfsize.y;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num = Mathf.Abs(vector4.x);
num2 = Mathf.Abs(vector4.y);
num3 = Mathf.Abs(vector4.z);
num4 = vector4.z * vector.y - vector4.y * vector.z;
num9 = vector4.z * vector2.y - vector4.y * vector2.z;
if (num4 < num9)
{
num6 = num4;
num7 = num9;
}
else
{
num6 = num9;
num7 = num4;
}
num8 = num3 * boxhalfsize.y + num2 * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num4 = (0f - vector4.z) * vector.x + vector4.x * vector.z;
num9 = (0f - vector4.z) * vector2.x + vector4.x * vector2.z;
if (num4 < num9)
{
num6 = num4;
num7 = num9;
}
else
{
num6 = num9;
num7 = num4;
}
num8 = num3 * boxhalfsize.z + num * boxhalfsize.z;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
num9 = vector4.y * vector2.x - vector4.x * vector2.y;
num5 = vector4.y * vector3.x - vector4.x * vector3.y;
if (num5 < num9)
{
num6 = num5;
num7 = num9;
}
else
{
num6 = num9;
num7 = num5;
}
num8 = num2 * boxhalfsize.x + num * boxhalfsize.y;
if (num6 > num8 || num7 < 0f - num8)
{
return false;
}
FINDMINMAX(vector.x, vector2.x, vector3.x, out num6, out num7);
if (num6 > boxhalfsize.x || num7 < 0f - boxhalfsize.x)
{
return false;
}
FINDMINMAX(vector.y, vector2.y, vector3.y, out num6, out num7);
if (num6 > boxhalfsize.y || num7 < 0f - boxhalfsize.y)
{
return false;
}
FINDMINMAX(vector.z, vector2.z, vector3.z, out num6, out num7);
if (num6 > boxhalfsize.z || num7 < 0f - boxhalfsize.z)
{
return false;
}
Vector3 normal = Vector3.Cross(lhs, rhs);
if (!planeBoxOverlap(normal, vector, boxhalfsize))
{
return false;
}
return true;
}
}