Beispiel #1
0
        /// @{
        /// @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;
        }