PODVector<unsigned char> NavigationMesh::GetNavigationDataAttr() const { VectorBuffer ret; if (navMesh_) { ret.WriteBoundingBox(boundingBox_); ret.WriteInt(numTilesX_); ret.WriteInt(numTilesZ_); const dtNavMeshParams* params = navMesh_->getParams(); ret.WriteFloat(params->tileWidth); ret.WriteFloat(params->tileHeight); ret.WriteInt(params->maxTiles); ret.WriteInt(params->maxPolys); const dtNavMesh* navMesh = navMesh_; for (int z = 0; z < numTilesZ_; ++z) { for (int x = 0; x < numTilesX_; ++x) { const dtMeshTile* tile = navMesh->getTileAt(x, z, 0); if (!tile) continue; ret.WriteInt(x); ret.WriteInt(z); ret.WriteUInt(navMesh->getTileRef(tile)); ret.WriteUInt((unsigned)tile->dataSize); ret.Write(tile->data, (unsigned)tile->dataSize); } } } return ret.GetBuffer(); }
PODVector<unsigned char> DynamicNavigationMesh::GetNavigationDataAttr() const { VectorBuffer ret; if (navMesh_ && tileCache_) { ret.WriteBoundingBox(boundingBox_); ret.WriteInt(numTilesX_); ret.WriteInt(numTilesZ_); const dtNavMeshParams* params = navMesh_->getParams(); ret.Write(params, sizeof(dtNavMeshParams)); const dtTileCacheParams* tcParams = tileCache_->getParams(); ret.Write(tcParams, sizeof(dtTileCacheParams)); for (int z = 0; z < numTilesZ_; ++z) { for (int x = 0; x < numTilesX_; ++x) { dtCompressedTileRef tiles[TILECACHE_MAXLAYERS]; const int ct = tileCache_->getTilesAt(x, z, tiles, TILECACHE_MAXLAYERS); for (int i = 0; i < ct; ++i) { const dtCompressedTile* tile = tileCache_->getTileByRef(tiles[i]); if (!tile || !tile->header || !tile->dataSize) continue; // Don't write "void-space" tiles // The header conveniently has the majority of the information required ret.Write(tile->header, sizeof(dtTileCacheLayerHeader)); ret.WriteInt(tile->dataSize); ret.Write(tile->data, tile->dataSize); } } } } return ret.GetBuffer(); }
PODVector<unsigned char> DynamicNavigationMesh::GetNavigationDataAttr() const { VectorBuffer ret; if (navMesh_ && tileCache_) { ret.WriteBoundingBox(boundingBox_); ret.WriteInt(numTilesX_); ret.WriteInt(numTilesZ_); const dtNavMeshParams* params = navMesh_->getParams(); ret.Write(params, sizeof(dtNavMeshParams)); const dtTileCacheParams* tcParams = tileCache_->getParams(); ret.Write(tcParams, sizeof(dtTileCacheParams)); for (int z = 0; z < numTilesZ_; ++z) for (int x = 0; x < numTilesX_; ++x) WriteTiles(ret, x, z); } return ret.GetBuffer(); }