1
This commit is contained in:
parent
d7c6c79045
commit
13a3180041
@ -105,13 +105,6 @@ struct ConvexVolume
|
||||
rcAreaModification areaMod;
|
||||
};
|
||||
|
||||
static int calcLayerBufferSize(const int gridWidth, const int gridHeight)
|
||||
{
|
||||
const int headerSize = dtAlign4(sizeof(dtTileCacheLayerHeader));
|
||||
const int gridSize = gridWidth * gridHeight;
|
||||
return headerSize + gridSize*4;
|
||||
}
|
||||
|
||||
inline bool checkOverlapRect(const float amin[2], const float amax[2],
|
||||
const float bmin[2], const float bmax[2])
|
||||
{
|
||||
@ -306,6 +299,8 @@ struct BuilderParams
|
||||
LinearAllocator* talloc = nullptr;
|
||||
FastLZCompressor* tcomp = nullptr;
|
||||
MeshProcess* tmproc = nullptr;
|
||||
dtTileCache* tile_cache = nullptr;
|
||||
dtNavMesh* navmesh = nullptr;
|
||||
int gw = 0;
|
||||
int gh = 0;
|
||||
|
||||
@ -317,87 +312,28 @@ struct BuilderParams
|
||||
dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance)
|
||||
{
|
||||
BuilderParams builder_params;
|
||||
// Init cache
|
||||
rcCalcGridSize(builder_params.bmin,
|
||||
builder_params.bmax,
|
||||
builder_params.kCellSize,
|
||||
&builder_params.gw,
|
||||
&builder_params.gh);
|
||||
builder_params.ts = (int)kTileSize;
|
||||
builder_params.tw = (builder_params.gw + builder_params.ts-1) / builder_params.ts;
|
||||
builder_params.th = (builder_params.gh + builder_params.ts-1) / builder_params.ts;
|
||||
|
||||
InitBasic(builder_params);
|
||||
InitRcConfig(builder_params);
|
||||
InitTileCacheParams(builder_params);
|
||||
|
||||
dtStatus status;
|
||||
|
||||
dtTileCache* tile_cache = dtAllocTileCache();
|
||||
status = tile_cache->init(&builder_params.tcparams,
|
||||
builder_params.talloc,
|
||||
builder_params.tcomp,
|
||||
builder_params.tmproc);
|
||||
builder_params.tile_cache = dtAllocTileCache();
|
||||
status = builder_params.tile_cache->init(&builder_params.tcparams,
|
||||
builder_params.talloc,
|
||||
builder_params.tcomp,
|
||||
builder_params.tmproc);
|
||||
|
||||
dtNavMeshParams params;
|
||||
{
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
rcVcopy(params.orig, builder_params.bmin);
|
||||
params.tileWidth = kTileSize * builder_params.kCellSize;
|
||||
params.tileHeight = kTileSize * builder_params.kCellSize;
|
||||
params.maxTiles = kMaxTiles;
|
||||
params.maxPolys = kMaxPolysPerTile;
|
||||
}
|
||||
InitNavMeshParams(builder_params, params);
|
||||
builder_params.navmesh = dtAllocNavMesh();
|
||||
|
||||
dtNavMesh* navmesh = dtAllocNavMesh();
|
||||
|
||||
status = navmesh->init(¶ms);
|
||||
status = builder_params.navmesh->init(¶ms);
|
||||
if (dtStatusFailed(status)) {
|
||||
abort();
|
||||
}
|
||||
|
||||
int m_cacheLayerCount = 0;
|
||||
int m_cacheCompressedSize = 0;
|
||||
int m_cacheRawSize = 0;
|
||||
|
||||
for (int y = 0; y < builder_params.th; ++y) {
|
||||
for (int x = 0; x < builder_params.tw; ++x) {
|
||||
TileCacheData tiles[MAX_LAYERS];
|
||||
memset(tiles, 0, sizeof(tiles));
|
||||
int ntiles = RasterizeTileLayers(x, y, builder_params.cfg, tiles, MAX_LAYERS);
|
||||
|
||||
for (int i = 0; i < ntiles; ++i) {
|
||||
TileCacheData* tile = &tiles[i];
|
||||
status = tile_cache->addTile(tile->data, tile->dataSize, DT_COMPRESSEDTILE_FREE_DATA, 0);
|
||||
if (dtStatusFailed(status))
|
||||
{
|
||||
dtFree(tile->data);
|
||||
tile->data = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
m_cacheLayerCount++;
|
||||
m_cacheCompressedSize += tile->dataSize;
|
||||
m_cacheRawSize += calcLayerBufferSize(builder_params.tcparams.width,
|
||||
builder_params.tcparams.height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build initial meshes
|
||||
for (int y = 0; y < builder_params.th; ++y) {
|
||||
for (int x = 0; x < builder_params.tw; ++x) {
|
||||
tile_cache->buildNavMeshTilesAt(x,y, navmesh);
|
||||
}
|
||||
}
|
||||
|
||||
const dtNavMesh* nav = navmesh;
|
||||
int navmeshMemUsage = 0;
|
||||
for (int i = 0; i < nav->getMaxTiles(); ++i) {
|
||||
const dtMeshTile* tile = nav->getTile(i);
|
||||
if (tile->header) {
|
||||
navmeshMemUsage += tile->dataSize;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
BuildTiles(builder_params);
|
||||
return builder_params.navmesh;
|
||||
}
|
||||
|
||||
void NavMeshBuilder::OutputObjFile(MapInstance* map_instance)
|
||||
@ -502,6 +438,19 @@ void NavMeshBuilder::OutputObjFile(MapInstance* map_instance)
|
||||
}
|
||||
}
|
||||
|
||||
void NavMeshBuilder::InitBasic(BuilderParams& builder_params)
|
||||
{
|
||||
// Init cache
|
||||
rcCalcGridSize(builder_params.bmin,
|
||||
builder_params.bmax,
|
||||
builder_params.kCellSize,
|
||||
&builder_params.gw,
|
||||
&builder_params.gh);
|
||||
builder_params.ts = (int)kTileSize;
|
||||
builder_params.tw = (builder_params.gw + builder_params.ts-1) / builder_params.ts;
|
||||
builder_params.th = (builder_params.gh + builder_params.ts-1) / builder_params.ts;
|
||||
}
|
||||
|
||||
void NavMeshBuilder::InitRcConfig(BuilderParams& builder_params)
|
||||
{
|
||||
rcConfig& cfg = builder_params.cfg;
|
||||
@ -545,6 +494,47 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params)
|
||||
tcparams.maxObstacles = 128;
|
||||
}
|
||||
|
||||
void NavMeshBuilder::InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params)
|
||||
{
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
rcVcopy(params.orig, builder_params.bmin);
|
||||
params.tileWidth = kTileSize * builder_params.kCellSize;
|
||||
params.tileHeight = kTileSize * builder_params.kCellSize;
|
||||
params.maxTiles = kMaxTiles;
|
||||
params.maxPolys = kMaxPolysPerTile;
|
||||
}
|
||||
|
||||
void NavMeshBuilder::BuildTiles(BuilderParams& builder_params)
|
||||
{
|
||||
for (int y = 0; y < builder_params.th; ++y) {
|
||||
for (int x = 0; x < builder_params.tw; ++x) {
|
||||
TileCacheData tiles[MAX_LAYERS];
|
||||
memset(tiles, 0, sizeof(tiles));
|
||||
int ntiles = RasterizeTileLayers(x, y, builder_params.cfg, tiles, MAX_LAYERS);
|
||||
|
||||
for (int i = 0; i < ntiles; ++i) {
|
||||
TileCacheData* tile = &tiles[i];
|
||||
dtStatus status = builder_params.tile_cache->addTile(tile->data,
|
||||
tile->dataSize,
|
||||
DT_COMPRESSEDTILE_FREE_DATA,
|
||||
0);
|
||||
if (dtStatusFailed(status)) {
|
||||
dtFree(tile->data);
|
||||
tile->data = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Build initial meshes
|
||||
for (int y = 0; y < builder_params.th; ++y) {
|
||||
for (int x = 0; x < builder_params.tw; ++x) {
|
||||
builder_params.tile_cache->buildNavMeshTilesAt(x,y, builder_params.navmesh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int NavMeshBuilder::RasterizeTileLayers(const int tx, const int ty,
|
||||
const rcConfig& cfg,
|
||||
TileCacheData* tiles,
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
struct rcConfig;
|
||||
struct dtTileCacheParams;
|
||||
struct dtNavMeshParams;
|
||||
struct BuilderParams;
|
||||
struct TileCacheData;
|
||||
class dtNavMesh;
|
||||
@ -20,8 +21,11 @@ public:
|
||||
void OutputObjFile(MapInstance* map_instance);
|
||||
|
||||
private:
|
||||
void InitBasic(BuilderParams& builder_params);
|
||||
void InitRcConfig(BuilderParams& builder_params);
|
||||
void InitTileCacheParams(BuilderParams& builder_params);
|
||||
void InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params);
|
||||
void BuildTiles(BuilderParams& builder_params);
|
||||
int RasterizeTileLayers(const int tx, const int ty,
|
||||
const rcConfig& cfg,
|
||||
TileCacheData* tiles,
|
||||
|
Loading…
x
Reference in New Issue
Block a user