All-
Since I was able to dump 1 mesh per ADT, I now am working towards everyone's reco on using 16 tiles per ADT, but I'm running into a few problems (can't read them back into 1 tile) and would like to know how I can correct this. Here is how I'm saving the 16 nav meshes to one file:
Code:
char fileName[2048];
sprintf(fileName,"%s/%i_%i.mesh", [directory UTF8String], tx, ty);
FILE* fp = fopen(fileName, "wb");
if (!fp)
return ;
dtNavMeshParams navMeshParams;
navMeshParams.tileWidth = GRID_SIZE / GridDiv;
navMeshParams.tileHeight = GRID_SIZE / GridDiv;
navMeshParams.orig[0] = -(32 * GRID_SIZE);
navMeshParams.orig[1] = -(32 * GRID_SIZE);
navMeshParams.orig[2] = -(32 * GRID_SIZE);
navMeshParams.maxTiles = 1000;
navMeshParams.maxPolys = MaxPoly;
NavMeshSetHeader header;
header.magic = NAVMESHSET_MAGIC;
header.version = NAVMESHSET_VERSION;
header.numTiles = tileNum;
memcpy(&header.params, &navMeshParams, sizeof(dtNavMeshParams));
fwrite(&header, sizeof(NavMeshSetHeader), 1, fp);
for ( int i = 0; i < tileNum; i++ ){
NavMeshTileHeader tileHeader;
tileHeader.tileRef = 0;
tileHeader.dataSize = meshData[i].dataSize;
fwrite(&tileHeader, sizeof(tileHeader), 1, fp);
fwrite(meshData[i].data, meshData[i].dataSize, 1, fp);
dtFree(meshData[i].data);
}
fclose(fp);
Now the issue I'm running into is how to read these in, as as soon as I read the first of the 16, it takes over that (x,y) within the dtNavMesh. Here is how I'm reading them in:
Code:
// Read tiles.
for (int i = 0; i < header.numTiles; ++i){
NavMeshTileHeader tileHeader;
fread(&tileHeader, sizeof(tileHeader), 1, fp);
if (!tileHeader.dataSize)
break;
NSLog(@" %d: %d", i, tileHeader.dataSize);
unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM);
if (!data) break;
memset(data, 0, tileHeader.dataSize);
fread(data, tileHeader.dataSize, 1, fp);
dtTileRef* tile = new dtTileRef();
dtStatus dtResult = _navMesh->addTile(data, tileHeader.dataSize, DT_TILE_FREE_DATA, 0, tile);
if ( dtResult != DT_SUCCESS ){
NSLog(@"Error: could not load into navmesh 0x%X", dtResult);
if (dtStatusDetail(dtResult, DT_OUT_OF_MEMORY))
{
}
dtFree(data);
return false;
}
}
Now addTile returns DT_FAILURE on the second tile read since there is already a tile at (x,y) due to the first loop. How can I fix this? I'm at a loss as to how I should read these in now.
Thanks!
~ Tanaris