private MyNavigationTriangle GetClosestNavigationTriangle(ref Vector3 point, ref float closestDistanceSq) { MyNavigationTriangle triangle = null; Vector3I vectori = Vector3I.Round((point + (this.m_voxelMap.PositionComp.GetPosition() - this.m_voxelMap.PositionLeftBottomCorner)) / this.m_cellSize); for (int i = 0; i < 8; i++) { Vector3I position = (Vector3I)(vectori + m_cornerOffsets[i]); if (this.m_processedCells.Contains(position)) { ulong packedCellCoord = new MyCellCoord(0, position).PackId64(); MyIntervalList list = this.m_higherLevelHelper.TryGetTriangleList(packedCellCoord); if (list != null) { MyIntervalList.Enumerator enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { int current = enumerator.Current; MyNavigationTriangle triangle2 = base.GetTriangle(current); float num4 = Vector3.DistanceSquared(triangle2.Center, point); if (num4 < closestDistanceSq) { closestDistanceSq = num4; triangle = triangle2; } } } } } return(triangle); }
private bool RemoveCell(Vector3I cell) { if (!MyFakes.REMOVE_VOXEL_NAVMESH_CELLS) { return(true); } if (!this.m_processedCells.Contains(cell)) { return(false); } if (MyFakes.LOG_NAVMESH_GENERATION) { MyCestmirPathfindingShorts.Pathfinding.VoxelPathfinding.DebugLog.LogCellRemoval(this, cell); } MyVoxelPathfinding.CellId cellId = new MyVoxelPathfinding.CellId { VoxelMap = this.m_voxelMap, Pos = cell }; this.m_navmeshCoordinator.RemoveVoxelNavmeshLinks(cellId); ulong packedCellCoord = new MyCellCoord(0, cell).PackId64(); MyIntervalList list = this.m_higherLevelHelper.TryGetTriangleList(packedCellCoord); if (list != null) { MyIntervalList.Enumerator enumerator = list.GetEnumerator(); while (true) { if (!enumerator.MoveNext()) { this.m_higherLevelHelper.ClearCachedCell(packedCellCoord); break; } int current = enumerator.Current; this.RemoveTerrainTriangle(base.GetTriangle(current)); } } this.m_processedCells.Remove(ref cell); return(list != null); }
private MyNavmeshComponents.ClosedCellInfo ConstructComponents() { long start = this.m_mesh.GetCurrentTimestamp() + 1L; long end = start; this.m_currentComponentRel = 0; this.m_navmeshComponents.OpenCell(this.m_packedCoord); this.m_tmpComponentTriangles.Clear(); MyIntervalList.Enumerator enumerator = this.m_triangleList.GetEnumerator(); while (enumerator.MoveNext()) { int current = enumerator.Current; this.m_currentComponentMarker = -2 - this.m_currentComponentRel; MyNavigationTriangle vertex = this.m_mesh.GetTriangle(current); if (!this.m_mesh.VisitedBetween(vertex, start, end)) { this.m_navmeshComponents.OpenComponent(); if (this.m_currentComponentRel >= this.m_currentCellConnections.Count) { this.m_currentCellConnections.Add(new List <ConnectionInfo>()); } m_currentHelper = this; this.m_navmeshComponents.AddComponentTriangle(vertex, vertex.Center); vertex.ComponentIndex = this.m_currentComponentMarker; this.m_tmpComponentTriangles.Add(vertex); this.m_mesh.PrepareTraversal(vertex, null, this.m_processTrianglePredicate, null); this.m_mesh.PerformTraversal(); this.m_tmpComponentTriangles.Add(null); this.m_navmeshComponents.CloseComponent(); end = this.m_mesh.GetCurrentTimestamp(); this.m_currentComponentRel++; } } MyNavmeshComponents.ClosedCellInfo output = new MyNavmeshComponents.ClosedCellInfo(); this.m_navmeshComponents.CloseAndCacheCell(ref output); return(output); }