Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }