/// @{ /// @name Initialization and Tile Management /// Initializes the navigation mesh for tiled use. /// @param[in] params Initialization parameters. /// @return The status flags for the operation. public dtStatus init(dtNavMeshParams navMeshParams) { //memcpy(&m_params, params, sizeof(dtNavMeshParams)); m_params = navMeshParams.Clone(); dtVcopy(m_orig, navMeshParams.orig); m_tileWidth = navMeshParams.tileWidth; m_tileHeight = navMeshParams.tileHeight; // Init tiles m_maxTiles = navMeshParams.maxTiles; m_tileLutSize = (int)dtNextPow2((uint)(navMeshParams.maxTiles/4)); if (m_tileLutSize == 0) m_tileLutSize = 1; m_tileLutMask = m_tileLutSize-1; //m_tiles = (dtMeshTile*)dtAlloc(sizeof(dtMeshTile)*m_maxTiles, DT_ALLOC_PERM); m_tiles = new dtMeshTile[m_maxTiles]; dtcsArrayItemsCreate(m_tiles); if (m_tiles == null) return (DT_FAILURE | DT_OUT_OF_MEMORY); //m_posLookup = (dtMeshTile**)dtAlloc(sizeof(dtMeshTile*)*m_tileLutSize, DT_ALLOC_PERM); m_posLookup = new dtMeshTile[m_tileLutSize]; dtcsArrayItemsCreate(m_posLookup); if (m_posLookup == null) return DT_FAILURE | DT_OUT_OF_MEMORY; //memset(m_tiles, 0, sizeof(dtMeshTile)*m_maxTiles); //memset(m_posLookup, 0, sizeof(dtMeshTile*)*m_tileLutSize); m_nextFree = null; for (int i = m_maxTiles-1; i >= 0; --i) { m_tiles[i].salt = 1; m_tiles[i].next = m_nextFree; m_nextFree = m_tiles[i]; } // Init ID generator values. #if DT_POLYREF64 #else m_tileBits = (dtStatus)dtIlog2(dtNextPow2((uint)navMeshParams.maxTiles)); m_polyBits = (dtStatus)dtIlog2(dtNextPow2((uint)navMeshParams.maxPolys)); // Only allow 31 salt bits, since the salt mask is calculated using 32bit uint and it will overflow. m_saltBits = Math.Min((uint)31, 32 - m_tileBits - m_polyBits); if (m_saltBits < 10) return DT_FAILURE | DT_INVALID_PARAM; #endif return DT_SUCCESS; }