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"); } }
/// <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); }