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