Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Constructor of AxisAlignedBox
 /// </summary>
 /// <param name="aabb">Source AxisAlignedBox</param>
 public AxisAlignedBox(AxisAlignedBox aabb)
 {
     SetFromAabb(aabb);
 }
Ejemplo n.º 3
0
 /// <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;
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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);
        }