void Sample_TileMesh::buildTile(const float* pos) { if (!m_geom) return; if (!m_navMesh) return; const float* bmin = m_geom->getMeshBoundsMin(); const float* bmax = m_geom->getMeshBoundsMax(); const float ts = m_tileSize*m_cellSize; const int tx = (int)((pos[0] - bmin[0]) / ts); const int ty = (int)((pos[2] - bmin[2]) / ts); m_tileBmin[0] = bmin[0] + tx*ts; m_tileBmin[1] = bmin[1]; m_tileBmin[2] = bmin[2] + ty*ts; m_tileBmax[0] = bmin[0] + (tx+1)*ts; m_tileBmax[1] = bmax[1]; m_tileBmax[2] = bmin[2] + (ty+1)*ts; m_tileCol = duRGBA(77,204,0,255); int dataSize = 0; unsigned char* data = buildTileMesh(tx, ty, m_tileBmin, m_tileBmax, dataSize); if (data) { // Remove any previous data (navmesh owns and deletes the data). m_navMesh->removeTile(m_navMesh->getTileRefAt(tx,ty),0,0); // Let the navmesh own the data. if (!m_navMesh->addTile(data,dataSize,DT_TILE_FREE_DATA)) dtFree(data); } }
void Sample_TileMesh::buildAllTiles() { if (!m_geom) return; if (!m_navMesh) return; const float* bmin = m_geom->getNavMeshBoundsMin(); const float* bmax = m_geom->getNavMeshBoundsMax(); int gw = 0, gh = 0; rcCalcGridSize(bmin, bmax, m_cellSize, &gw, &gh); const int ts = (int)m_tileSize; const int tw = (gw + ts-1) / ts; const int th = (gh + ts-1) / ts; const float tcs = m_tileSize*m_cellSize; // Start the build process. m_ctx->startTimer(RC_TIMER_TEMP); for (int y = 0; y < th; ++y) { for (int x = 0; x < tw; ++x) { m_lastBuiltTileBmin[0] = bmin[0] + x*tcs; m_lastBuiltTileBmin[1] = bmin[1]; m_lastBuiltTileBmin[2] = bmin[2] + y*tcs; m_lastBuiltTileBmax[0] = bmin[0] + (x+1)*tcs; m_lastBuiltTileBmax[1] = bmax[1]; m_lastBuiltTileBmax[2] = bmin[2] + (y+1)*tcs; int dataSize = 0; unsigned char* data = buildTileMesh(x, y, m_lastBuiltTileBmin, m_lastBuiltTileBmax, dataSize); if (data) { // Remove any previous data (navmesh owns and deletes the data). m_navMesh->removeTile(m_navMesh->getTileRefAt(x,y,0),0,0); // Let the navmesh own the data. dtStatus status = m_navMesh->addTile(data,dataSize,DT_TILE_FREE_DATA,0,0); if (dtStatusFailed(status)) dtFree(data); } } } // Start the build process. m_ctx->stopTimer(RC_TIMER_TEMP); m_totalBuildTimeMs = m_ctx->getAccumulatedTime(RC_TIMER_TEMP)/1000.0f; }
void Sample_TileMesh::buildAllTiles() { if (!m_geom) return; if (!m_navMesh) return; const float* bmin = m_geom->getMeshBoundsMin(); const float* bmax = m_geom->getMeshBoundsMax(); int gw = 0, gh = 0; rcCalcGridSize(bmin, bmax, m_cellSize, &gw, &gh); const int ts = (int)m_tileSize; const int tw = (gw + ts-1) / ts; const int th = (gh + ts-1) / ts; const float tcs = m_tileSize*m_cellSize; // Start the build process. rcTimeVal totStartTime = m_ctx->getTime(); for (int y = 0; y < th; ++y) { for (int x = 0; x < tw; ++x) { m_tileBmin[0] = bmin[0] + x*tcs; m_tileBmin[1] = bmin[1]; m_tileBmin[2] = bmin[2] + y*tcs; m_tileBmax[0] = bmin[0] + (x+1)*tcs; m_tileBmax[1] = bmax[1]; m_tileBmax[2] = bmin[2] + (y+1)*tcs; int dataSize = 0; unsigned char* data = buildTileMesh(x, y, m_tileBmin, m_tileBmax, dataSize); if (data) { // Remove any previous data (navmesh owns and deletes the data). m_navMesh->removeTile(m_navMesh->getTileRefAt(x,y),0,0); // Let the navmesh own the data. if (!m_navMesh->addTile(data,dataSize,true)) dtFree(data); } } } // Start the build process. rcTimeVal totEndTime = m_ctx->getTime(); m_totalBuildTimeMs = m_ctx->getDeltaTimeUsec(totStartTime, totEndTime)/1000.0f; }
unsigned char* RecastTileBuilder::build(float x, float y, const AABB& lastTileBounds, int& dataSize) { int gw = 0, gh = 0; float bmin[3]; float bmax[3]; bmin[0] = bounds.getXMin(); bmin[1] = bounds.getYMin(); bmin[2] = bounds.getZMin(); bmax[0] = bounds.getXMax(); bmax[1] = bounds.getYMax(); bmax[2] = bounds.getZMax(); rcCalcGridSize(bmin, bmax, settings.m_cellSize, &gw, &gh); const int ts = (int) settings.m_tileSize; const int tw = (gw + ts - 1) / ts; const int th = (gh + ts - 1) / ts; // Max tiles and max polys affect how the tile IDs are caculated. // There are 22 bits available for identifying a tile and a polygon. int tileBits = rcMin((int) ilog2(nextPow2(tw * th)), 14); int polyBits = 22 - tileBits; m_maxTiles = 1<<tileBits; m_maxPolysPerTile = 1<<polyBits; dtNavMeshParams params; params.orig[0] = bounds.getXMin(); params.orig[1] = bounds.getYMin(); params.orig[2] = bounds.getZMin(); //rcVcopy(params.orig, m_geom->getNavMeshBoundsMin()); params.tileWidth = settings.m_tileSize * settings.m_cellSize; params.tileHeight = settings.m_tileSize * settings.m_cellSize; params.maxTiles = m_maxTiles; params.maxPolys = m_maxPolysPerTile; dtStatus status; this->lastTileBounds = lastTileBounds; return buildTileMesh(x, y, dataSize); }
void Sample_TileMesh::buildTile(const float* pos) { if (!m_geom) return; if (!m_navMesh) return; const float* bmin = m_geom->getNavMeshBoundsMin(); const float* bmax = m_geom->getNavMeshBoundsMax(); const float ts = m_tileSize*m_cellSize; const int tx = (int)((pos[0] - bmin[0]) / ts); const int ty = (int)((pos[2] - bmin[2]) / ts); m_lastBuiltTileBmin[0] = bmin[0] + tx*ts; m_lastBuiltTileBmin[1] = bmin[1]; m_lastBuiltTileBmin[2] = bmin[2] + ty*ts; m_lastBuiltTileBmax[0] = bmin[0] + (tx+1)*ts; m_lastBuiltTileBmax[1] = bmax[1]; m_lastBuiltTileBmax[2] = bmin[2] + (ty+1)*ts; m_tileCol = duRGBA(255,255,255,64); m_ctx->resetLog(); int dataSize = 0; unsigned char* data = buildTileMesh(tx, ty, m_lastBuiltTileBmin, m_lastBuiltTileBmax, dataSize); // Remove any previous data (navmesh owns and deletes the data). m_navMesh->removeTile(m_navMesh->getTileRefAt(tx,ty,0),0,0); // Add tile, or leave the location empty. if (data) { // Let the navmesh own the data. dtStatus status = m_navMesh->addTile(data,dataSize,DT_TILE_FREE_DATA,0,0); if (dtStatusFailed(status)) dtFree(data); } m_ctx->dumpLog("Build Tile (%d,%d):", tx,ty); }