public bool TestSlow(out MyEntity blockingPath, out Vector3?pointOfObstruction) { m_logger.debugLog("m_offendingEntities == null, did you remember to call TestFast()?", Logger.severity.FATAL, condition: m_offendingEntities == null); IMyCubeBlock ignoreBlock = m_ignoreEntity as IMyCubeBlock; foreach (MyEntity entity in m_offendingEntities) { m_logger.debugLog("checking entity: " + entity.getBestName()); MyVoxelBase voxel = entity as MyVoxelBase; if (voxel != null) { if (TestVoxel(voxel, m_path, out pointOfObstruction)) { continue; } else { blockingPath = entity; return(false); } } IMyCubeGrid grid = entity as IMyCubeGrid; if (grid != null) { if (m_profiler.rejectionIntersects(grid, ignoreBlock, out blockingPath, out pointOfObstruction)) { return(false); } continue; } m_logger.debugLog("not a grid, testing bounds"); if (!m_path.IntersectsAABB(entity)) { continue; } if (!m_path.IntersectsVolume(entity)) { continue; } m_logger.debugLog("no more tests for non-grids are implemented", Logger.severity.DEBUG); pointOfObstruction = m_path.get_Line().ClosestPoint(entity.GetCentre()); blockingPath = entity; return(false); } blockingPath = null; pointOfObstruction = null; return(true); }
/// <param name="offenders">entities to test</param> /// <param name="myGridShape">iff null, skip rejection test</param> private IMyEntity TestEntities(ICollection <IMyEntity> offenders, Capsule path, GridShapeProfiler myGridShape, out Vector3?pointOfObstruction, IMyCubeGrid GridDestination) { foreach (IMyEntity entity in offenders) { CheckInterrupt(); myLogger.debugLog("testing offender: " + entity.getBestName() + " at " + entity.GetPosition(), "TestEntities()"); IMyCubeGrid asGrid = entity as IMyCubeGrid; if (asGrid != null) { if (asGrid == GridDestination) { myLogger.debugLog("grid is destination: " + asGrid.DisplayName, "TestEntities()"); continue; } if (!path.IntersectsAABB(entity)) { myLogger.debugLog("no AABB intersection: " + asGrid.DisplayName, "TestEntities()"); continue; } myLogger.debugLog("searching blocks of " + entity.getBestName(), "TestEntities()"); uint cellCount = 0, cellRejectedCount = 0; // foreach block float GridSize = asGrid.GridSize; List <IMySlimBlock> allSlims = new List <IMySlimBlock>(); asGrid.GetBlocks_Safe(allSlims); foreach (IMySlimBlock slim in allSlims) { bool blockIntersects = false; Vector3 cellPosWorld = new Vector3(); //myLogger.debugLog("slim = " + slim.getBestName() + ", fat = " + slim.FatBlock + ", cell = " + slim.Position, "TestEntities()"); //if (slim.FatBlock != null) //{ // myLogger.debugLog("fatblock min = " + slim.FatBlock.Min + ", fatblock max = " + slim.FatBlock.Max, "TestEntities()"); // //myLogger.debugLog("fatblock AABB min = " + slim.FatBlock.LocalAABB.Min + ", fatblock AABB max = " + slim.FatBlock.LocalAABB.Max, "TestEntities()"); //} slim.ForEachCell((cell) => { CheckInterrupt(); cellPosWorld = asGrid.GridIntegerToWorld(cell); cellCount++; //myLogger.debugLog("slim = " + slim.getBestName() + ", cell = " + cell + ", world position = " + cellPosWorld, "TestEntities()"); // intersects capsule if (!path.Intersects(cellPosWorld, GridSize)) { return(false); } // rejection cellRejectedCount++; if (myGridShape == null || myGridShape.rejectionIntersects(RelativeVector3F.createFromWorldAbsolute(cellPosWorld, myCubeGrid), myCubeGrid.GridSize)) { myLogger.debugLog("obstructing grid = " + asGrid.DisplayName + ", cell = " + cellPosWorld + ", block = " + slim.getBestName(), "TestEntities()", Logger.severity.DEBUG); blockIntersects = true; return(true); } //myLogger.debugLog("rejection: no collision, cell = " + cellPosWorld + ", block = " + slim.getBestName(), "TestEntities()", Logger.severity.DEBUG); return(false); }); if (blockIntersects) { //myLogger.debugLog("closest point on line: {" + path.get_Line().From + ", " + path.get_Line().To + "} to " + cellPosWorld + " is " + path.get_Line().ClosestPoint(cellPosWorld), "TestEntities()"); pointOfObstruction = path.get_Line().ClosestPoint(cellPosWorld); return(entity); } } myLogger.debugLog("no obstruction for grid " + asGrid.DisplayName + ", tested " + cellCount + " against capsule and " + cellRejectedCount + " against rejection", "TestPath()"); continue; } // not a grid if (IgnoreAsteroids && entity is IMyVoxelMap) { myLogger.debugLog("Ignoring asteroid: " + entity.getBestName(), "TestEntities()"); continue; } myLogger.debugLog("not a grid, testing bounds", "TestEntities()"); if (!path.IntersectsAABB(entity)) { continue; } if (!path.IntersectsVolume(entity)) { continue; } myLogger.debugLog("no more tests for non-grids are implemented", "TestEntities()", Logger.severity.DEBUG); //myLogger.debugLog("closest point on line: {" + path.get_Line().From + ", " + path.get_Line().To + "} to " + entity.GetCentre() + " is " + path.get_Line().ClosestPoint(entity.GetCentre()), "TestEntities()"); pointOfObstruction = path.get_Line().ClosestPoint(entity.GetCentre()); return(entity); } myLogger.debugLog("no obstruction was found", "TestPath()", Logger.severity.DEBUG); pointOfObstruction = null; return(null); }