Esempio n. 1
0
        public void Init(TileCacheParams tcparams, TileCacheMeshProcess tmproc)
        {
            m_params = tcparams;
            m_tmproc = tmproc;

            // Alloc space for obstacles.
            m_obstacles        = new TileCacheObstacle[tcparams.MaxObstacles];
            m_nextFreeObstacle = -1;
            for (int i = tcparams.MaxObstacles - 1; i >= 0; i--)
            {
                m_obstacles[i] = new TileCacheObstacle
                {
                    Salt = 1,
                    Next = m_nextFreeObstacle
                };
                m_nextFreeObstacle = i;
            }

            // Init tiles
            var m_tileLutSize = Helper.NextPowerOfTwo(tcparams.MaxTiles / 4);

            if (m_tileLutSize == 0)
            {
                m_tileLutSize = 1;
            }
            m_tileLutMask = m_tileLutSize - 1;

            m_tiles     = new CompressedTile[tcparams.MaxTiles];
            m_posLookup = new CompressedTile[m_tileLutSize];

            for (int i = tcparams.MaxTiles - 1; i >= 0; i--)
            {
                m_tiles[i] = new CompressedTile
                {
                    Salt = 1,
                    Next = m_nextFreeTile
                };
                m_nextFreeTile = m_tiles[i];
            }

            // Init ID generator values.
            m_tileBits = (int)Math.Log(Helper.NextPowerOfTwo(tcparams.MaxTiles), 2);

            // Only allow 31 salt bits, since the salt mask is calculated using 32bit uint and it will overflow.
            m_saltBits = Math.Min(31, 32 - m_tileBits);
            if (m_saltBits < 10)
            {
                throw new EngineException("NavMesh DT_INVALID_PARAM");
            }
        }
Esempio n. 2
0
            /// <summary>
            /// Creates a navigation mesh from a navigation mesh file
            /// </summary>
            /// <param name="file">Navigation mesh file</param>
            /// <returns>Returns the navigation mesh</returns>
            public static NavMesh FromNavmeshFile(NavMeshFile file)
            {
                NavMesh navmesh = new NavMesh();

                navmesh.Init(file.NavMeshParams);

                for (int i = 0; i < file.NavMeshData.Count; i++)
                {
                    var tile = file.NavMeshData[i];
                    if (tile == null || tile.Header.Magic != Detour.DT_NAVMESH_MAGIC)
                    {
                        continue;
                    }

                    navmesh.AddTile(tile, TileFlagTypes.DT_TILE_FREE_DATA, 0, out int res);
                }

                if (file.HasTileCache)
                {
                    var tmproc = new TileCacheMeshProcess(null);

                    navmesh.TileCache = new TileCache();
                    navmesh.TileCache.Init(file.TileCacheParams, tmproc);

                    for (int i = 0; i < file.TileCacheData.Count; i++)
                    {
                        var tile = file.TileCacheData[i];
                        if (tile.Header.Magic != DetourTileCache.DT_TILECACHE_MAGIC)
                        {
                            continue;
                        }

                        navmesh.TileCache.AddTile(tile, CompressedTileFlagTypes.DT_COMPRESSEDTILE_FREE_DATA);
                    }
                }

                return(navmesh);
            }