示例#1
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public void write(java.io.OutputStream stream, org.recast4j.detour.NavMesh mesh, java.nio.ByteOrder order, boolean cCompatibility) throws java.io.IOException
        public virtual void write(System.IO.Stream stream, NavMesh mesh, ByteOrder order, bool cCompatibility)
        {
            // Write header.
            write(stream, NavMeshSetHeader.NAVMESHSET_MAGIC, order);
            write(stream, cCompatibility ? NavMeshSetHeader.NAVMESHSET_VERSION : NavMeshSetHeader.NAVMESHSET_VERSION_RECAST4J, order);
            int numTiles = 0;

            for (int i = 0; i < mesh.MaxTiles; ++i)
            {
                MeshTile tile = mesh.getTile(i);
                if (tile == null || tile.data == null || tile.data.header == null)
                {
                    continue;
                }
                numTiles++;
            }
            write(stream, numTiles, order);
            paramWriter.write(stream, mesh.Params, order);

            // Store tiles.
            for (int i = 0; i < mesh.MaxTiles; ++i)
            {
                MeshTile tile = mesh.getTile(i);
                if (tile == null || tile.data == null || tile.data.header == null)
                {
                    continue;
                }

                NavMeshTileHeader tileHeader = new NavMeshTileHeader();
                tileHeader.tileRef = mesh.getTileRef(tile);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                writer.write(baos, tile.data, order, cCompatibility);
                sbyte[] ba = baos.toByteArray();
                tileHeader.dataSize = ba.Length;
                write(stream, tileHeader.tileRef, order);
                write(stream, tileHeader.dataSize, order);
                if (cCompatibility)
                {
                    write(stream, 0, order);                     // C struct padding
                }
                stream.Write(ba, 0, ba.Length);
            }
        }
示例#2
0
    public bool LoadZone(Zone zone)

    {
        if (zone == Zone.Unknown)
        {
            Unload();
            return(false);
        }

        string path = "navmeshes\\" + zone.ToString() + ".nav";

        if (_zone == zone && dtNavMesh != null)
        {
            return(true);
        }
        else
        {
            Unload();
        }

        _zone = zone;

        var headerBufferSize = NavMeshSetHeader.ByteSize();
        var headerBuffer     = new byte[headerBufferSize];

        if (!File.Exists(path))
        {
            return(false);
        }

        var file = File.OpenRead(path);

        file.Read(headerBuffer, 0, headerBufferSize);

        NavMeshSetHeader header = new NavMeshSetHeader();
        var headerBytesRead     = header.FromBytes(headerBuffer, 0);

        if (header.magic != NAVMESHSET_MAGIC)
        {
            return(false);
        }

        if (header.version != NAVMESHSET_VERSION)
        {
            return(false);
        }

        var navMesh = new Detour.dtNavMesh();

        navMesh.init(header.meshParams);

        for (int i = 0; i < header.numTiles; ++i)
        {
            var tileHeaderBuffer = new byte[NavMeshTileHeader.ByteSize()];
            file.Read(tileHeaderBuffer, 0, tileHeaderBuffer.Length);
            var tileHeader = new NavMeshTileHeader();
            tileHeader.FromBytes(tileHeaderBuffer, 0);
            if (tileHeader.dataSize == 0 || tileHeader.tileRef == 0)
            {
                break;
            }
            var rawTileData = new Detour.dtRawTileData();
            var data        = new byte[tileHeader.dataSize];
            file.Read(data, 0, data.Length);
            rawTileData.FromBytes(data, 0);
            uint result = 0;
            navMesh.addTile(rawTileData, tileHeader.dataSize, 0x01 /*DT_TILE_FREE_DATA*/, tileHeader.tileRef, ref result);
            if (Detour.dtStatusFailed(result))
            {
                return(false);
            }
        }

        // hard-code to make sure it is compatible with expectation.
        var maxPolys = header.meshParams.maxPolys;

        var status = new Detour.dtNavMeshQuery().init(navMesh, maxPolys);

        if (Detour.dtStatusFailed(status))
        {
            return(false);
        }

        dtNavMesh = navMesh;

        return(headerBytesRead > 0);
    }