/// <summary> /// Rejection test for intersection with the profiled grid. /// </summary> /// <param name="grid">Grid whose cells will be rejected and compared to the profiled grid's rejections.</param> /// <returns>True iff there is a collision</returns> public bool rejectionIntersects(IMyCubeGrid grid, IMyCubeBlock ignore, out MyEntity entity, out Vector3?pointOfObstruction) { m_logger.debugLog("m_grid == null", Logger.severity.FATAL, condition: m_grid == null); //m_logger.debugLog("testing grid: " + grid.getBestName(), "rejectionIntersects()"); GridCellCache gridCache = GridCellCache.GetCellCache(grid); MatrixD toLocal = m_grid.WorldMatrixNormalizedInv; Line pathLine = Path.get_Line(); float minDist = m_grid.GridSize + grid.GridSize; //if (!m_landing) // minDist += NotLandingBuffer; float pathRadius = Path.Radius + minDist; float minDistSquared = minDist * minDist; MyEntity entity_in = null; Vector3? pointOfObstruction_in = null; using (m_lock_rejcectionCells.AcquireSharedUsing()) gridCache.ForEach(cell => { Vector3 world = grid.GridIntegerToWorld(cell); //m_logger.debugLog("checking position: " + world, "rejectionIntersects()"); if (pathLine.PointInCylinder(pathRadius, world)) { //m_logger.debugLog("point in cylinder: " + world, "rejectionIntersects()"); Vector3 local = Vector3.Transform(world, toLocal); if (rejectionIntersects(local, minDistSquared)) { entity_in = grid.GetCubeBlock(cell).FatBlock as MyEntity ?? grid as MyEntity; if (ignore != null && entity_in == ignore) { return(false); } pointOfObstruction_in = pathLine.ClosestPoint(world); return(true); } } return(false); }); if (pointOfObstruction_in.HasValue) { entity = entity_in; pointOfObstruction = pointOfObstruction_in; return(true); } entity = null; pointOfObstruction = null; return(false); }
/// <summary> /// Perform a vector rejection of every occupied cell from DirectionNorm and store the results in rejectionCells. /// </summary> private void rejectAll() { using (m_lock_rejcectionCells.AcquireExclusiveUsing()) { m_rejectionCells.Clear(); m_centreRejection = RejectMetres(Centre); m_cellCache.ForEach(cell => { Vector3 rejection = RejectMetres(cell * m_grid.GridSize); m_rejectionCells.Add(rejection); }); } }