274 lines
5.4 KiB
C#
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;
|
|
}
|
|
}
|