Ejemplo n.º 1
0
        /// <summary>
        /// Tests for path intersection with voxel.
        /// </summary>
        /// <returns>True iff path is clear; voxel does not intersect path.</returns>
        private bool TestVoxel(MyVoxelBase voxel, Capsule path, out Vector3?pointOfObstruction)
        {
            if (m_ignoreAsteroid)
            {
                m_logger.debugLog("Ignoring asteroid: " + voxel.getBestName());
                pointOfObstruction = null;
                return(true);
            }

            Vector3[] intersection = new Vector3[2];
            if (!path.IntersectsAABB(voxel, out intersection[0]))
            {
                m_logger.debugLog("path does not intersect AABB. " + voxel.getBestName(), Logger.severity.TRACE);
                pointOfObstruction = null;
                return(true);
            }

            if (!path.get_Reverse().IntersectsAABB(voxel, out intersection[1]))
            {
                m_logger.debugLog("Reversed path does not intersect AABB, perhaps it moved? " + voxel.getBestName(), Logger.severity.WARNING);
                pointOfObstruction = null;
                return(true);
            }

            Capsule     testSection = new Capsule(intersection[0], intersection[1], path.Radius);
            IMyVoxelMap asteroid    = voxel as IMyVoxelMap;

            if (asteroid != null)
            {
                if (testSection.Intersects(asteroid, out pointOfObstruction))
                {
                    return(false);
                }
            }
            // planet test is done by PlanetChecker

            m_logger.debugLog("Does not intersect path: " + voxel.getBestName(), Logger.severity.TRACE);
            pointOfObstruction = null;
            return(true);
        }