/// <summary> /// Detects if this AABB contains another one /// </summary> /// <param name="aabb">AABB</param> /// <returns>Returns true if the specified AABB is contained otherwise false</returns> public bool Contains(AxisAlignedBox aabb) { Vector3 distance; Vector3.Subtract(ref Center, ref aabb.Center, out distance); return (Math.Abs(distance.X) + aabb.HalfSize.X <= HalfSize.X) & (Math.Abs(distance.Y) + aabb.HalfSize.Y <= HalfSize.Y) & (Math.Abs(distance.Z) + aabb.HalfSize.Z <= HalfSize.Z); }
/// <summary> /// Constructor of AxisAlignedBox /// </summary> /// <param name="aabb">Source AxisAlignedBox</param> public AxisAlignedBox(AxisAlignedBox aabb) { SetFromAabb(aabb); }
/// <summary> /// Sets this AABB from another one /// </summary> /// <param name="aabb">Source aabb</param> public void SetFromAabb(AxisAlignedBox aabb) { Center = aabb.Center; HalfSize = aabb.HalfSize; }
/// <summary> /// Merge the AABB with a specified AABB /// </summary> /// <param name="aabb">Source AABB</param> public void Merge(AxisAlignedBox aabb) { Vector3 max, min, otherMax, otherMin; Vector3.Add(ref Center, ref HalfSize, out max); Vector3.Add(ref aabb.Center, ref aabb.HalfSize, out otherMax); Vector3.Subtract(ref Center, ref HalfSize, out min); Vector3.Subtract(ref aabb.Center, ref aabb.HalfSize, out otherMin); Vector3.Max(ref max, ref otherMax, out max); Vector3.Min(ref min, ref otherMin, out min); if ((!float.IsPositiveInfinity(max.X)) && (!float.IsPositiveInfinity(max.Y)) && (!float.IsPositiveInfinity(max.Z))) { Vector3 maxPlusMin; Vector3.Add(ref max, ref min, out maxPlusMin); Vector3.Multiply(ref maxPlusMin, 0.5f, out Center); } Vector3 maxMinusMin; Vector3.Subtract(ref max, ref min, out maxMinusMin); Vector3.Multiply(ref maxMinusMin, 0.5f, out Center); }
/// <summary> /// Detects if this AABB intersects with another one /// </summary> /// <param name="aabb">AABB</param> /// <returns>Returns true if the two AABB intersects otherwise false</returns> public bool Intersects(AxisAlignedBox aabb) { Vector3 distance, sumHalfSize; Vector3.Subtract(ref Center, ref aabb.Center, out distance); Vector3.Add(ref HalfSize, ref aabb.HalfSize, out sumHalfSize); return (Math.Abs(distance.X) <= sumHalfSize.X) & (Math.Abs(distance.Y) <= sumHalfSize.Y) & (Math.Abs(distance.Z) <= sumHalfSize.Z); }
/// <summary> /// Updates the buffers /// </summary> /// <param name="box">Boundig box used to update buffers data</param> internal void UpdateBox(AxisAlignedBox box) { Vector3 min = box.Minimum; Vector3 max = box.Maximum; Vector3 xOffset = new Vector3((max.X - min.X), 0, 0); Vector3 zOffset = new Vector3(0, 0, (max.Z - min.Z)); Vector3 minOpposite; Vector3 maxOpposite; Vector3.Add(ref xOffset, ref zOffset, out minOpposite); Vector3.Subtract(ref max, ref minOpposite, out maxOpposite); Vector3.Add(ref min, ref minOpposite, out minOpposite); // Front vertices _vertices[FrontTopRight].Position = max; _vertices[FrontBottomRight].Position = minOpposite; Vector3.Subtract(ref max, ref xOffset, out _vertices[FrontTopLeft].Position); Vector3.Subtract(ref minOpposite, ref xOffset, out _vertices[FrontBottomLeft].Position); // Bottom vertices _vertices[BackBottomLeft].Position = min; _vertices[BackTopLeft].Position = maxOpposite; Vector3.Add(ref min, ref xOffset, out _vertices[BackBottomRight].Position); Vector3.Add(ref maxOpposite, ref xOffset, out _vertices[BackTopRight].Position); _vbo.SetData(_vertices); }