using Unity.Mathematics; namespace Pathfinding { /// /// Integer bounding box. /// Works almost like UnityEngine.BoundsInt but with a slightly nicer and more efficient api. /// /// Uses an exclusive upper bound (max field). /// public struct IntBounds { public int3 min, max; public IntBounds (int xmin, int ymin, int zmin, int xmax, int ymax, int zmax) { min = new int3(xmin, ymin, zmin); max = new int3(xmax, ymax, zmax); } public IntBounds(int3 min, int3 max) { this.min = min; this.max = max; } public int3 size => max - min; public int volume { get { var s = size; return s.x * s.y * s.z; } } /// /// Returns the intersection bounding box between the two bounds. /// The intersection bounds is the volume which is inside both bounds. /// If the rects do not have an intersection, an invalid rect is returned. /// See: IsValid /// public static IntBounds Intersection (IntBounds a, IntBounds b) { return new IntBounds( math.max(a.min, b.min), math.min(a.max, b.max) ); } public IntBounds Offset (int3 offset) { return new IntBounds(min + offset, max + offset); } public bool Contains (IntBounds other) { return math.all(other.min >= min & other.max <= max); } public override string ToString() => "(" + min.ToString() + " <= x < " + max.ToString() + ")"; public override bool Equals (object _b) { var b = (IntBounds)_b; return this == b; } public override int GetHashCode() => min.GetHashCode() ^ (max.GetHashCode() << 2); public static bool operator ==(IntBounds a, IntBounds b) => math.all(a.min == b.min & a.max == b.max); public static bool operator !=(IntBounds a, IntBounds b) => !(a == b); } }