I have this then it init's the navQuery, adds the obstacle (converted to RD coords), and finally update tileCache
Code:
void loadAll() {
dtTileCacheAlloc* talloc = new LinearAllocator(32000);
dtTileCacheCompressor* tcomp = new FastLZCompressor();
MeshProcess* tmproc = new MeshProcess();
std::string path = dir + "0.bin";
FILE* fp = nullptr;
// Open the file
if (fopen_s(&fp, path.c_str(), "rb") != 0 || !fp) {
printf("Error opening file: %s\n", path.c_str());
return;
}
// Read header.
size_t headerReadReturnCode = fread(&header, sizeof(TileCacheSetHeader), 1, fp);
if (headerReadReturnCode != 1)
{
// Error or early EOF
fclose(fp);
return;
}
if (header.magic != TILECACHESET_MAGIC)
{
fclose(fp);
return;
}
if (header.version != TILECACHESET_VERSION)
{
fclose(fp);
return;
}
alt_navMesh = dtAllocNavMesh();
if (!alt_navMesh)
{
fclose(fp);
return;
}
dtStatus status = alt_navMesh->init(&header.meshParams);
if (dtStatusFailed(status))
{
fclose(fp);
return;
}
m_tileCache = dtAllocTileCache();
if (!m_tileCache)
{
fclose(fp);
return;
}
status = m_tileCache->init(&header.cacheParams, talloc, tcomp, tmproc);
if (dtStatusFailed(status))
{
fclose(fp);
return;
}
// Read tiles.
for (int i = 0; i < header.numTiles; ++i)
{
TileCacheTileHeader tileHeader;
size_t tileHeaderReadReturnCode = fread(&tileHeader, sizeof(tileHeader), 1, fp);
if (tileHeaderReadReturnCode != 1)
{
// Error or early EOF
fclose(fp);
return;
}
if (!tileHeader.tileRef || !tileHeader.dataSize)
break;
unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM);
if (!data) break;
memset(data, 0, tileHeader.dataSize);
size_t tileDataReadReturnCode = fread(data, tileHeader.dataSize, 1, fp);
if (tileDataReadReturnCode != 1)
{
// Error or early EOF
dtFree(data);
fclose(fp);
return;
}
dtCompressedTileRef tile = 0;
dtStatus addTileStatus = m_tileCache->addTile(data, tileHeader.dataSize, DT_COMPRESSEDTILE_FREE_DATA, &tile);
if (dtStatusFailed(addTileStatus))
{
dtFree(data);
}
if (tile)
m_tileCache->buildNavMeshTile(tile, alt_navMesh);
}
fclose(fp);
}