1
This commit is contained in:
parent
67b7c7297a
commit
07b134b10b
@ -32,40 +32,15 @@ dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance)
|
||||
|
||||
void NavMeshBuilder::InitBuilderParams(BuilderParams& builder_params)
|
||||
{
|
||||
{
|
||||
// Init cache
|
||||
rcCalcGridSize(builder_params.gemo->GetMeshBoundsMin(),
|
||||
builder_params.gemo->GetMeshBoundsMax(),
|
||||
builder_params.kCellSize,
|
||||
&builder_params.gw,
|
||||
&builder_params.gh);
|
||||
builder_params.ts = (int)builder_params.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;
|
||||
}
|
||||
{
|
||||
rcConfig& cfg = builder_params.cfg;
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.cs = builder_params.kCellSize;
|
||||
cfg.ch = builder_params.kCellHeight;
|
||||
cfg.walkableSlopeAngle = builder_params.kAgentMaxSlope;
|
||||
cfg.walkableHeight = (int)ceilf(builder_params.kAgentHeight / cfg.ch);
|
||||
cfg.walkableClimb = (int)floorf(builder_params.kAgentMaxClimb / cfg.ch);
|
||||
cfg.walkableRadius = (int)ceilf(builder_params.kAgentRadius / cfg.cs);
|
||||
cfg.maxEdgeLen = (int)(builder_params.kEdgeMaxLen / builder_params.kCellSize);
|
||||
cfg.maxSimplificationError = builder_params.kEdgeMaxError;
|
||||
cfg.minRegionArea = (int)rcSqr(builder_params.kRegionMinSize); // Note: area = size*size
|
||||
cfg.mergeRegionArea = (int)rcSqr(builder_params.kRegionMergeSize); // Note: area = size*size
|
||||
cfg.maxVertsPerPoly = (int)builder_params.kVertsPerPoly;
|
||||
cfg.tileSize = (int)builder_params.kTileSize;
|
||||
cfg.borderSize = cfg.walkableRadius + 3; // Reserve enough padding.
|
||||
cfg.width = cfg.tileSize + cfg.borderSize*2;
|
||||
cfg.height = cfg.tileSize + cfg.borderSize*2;
|
||||
cfg.detailSampleDist = builder_params.kDetailSampleDist < 0.9f ? 0 : builder_params.kCellSize * builder_params.kDetailSampleDist;
|
||||
cfg.detailSampleMaxError = builder_params.kCellHeight * builder_params.kDetailSampleMaxError;
|
||||
rcVcopy(cfg.bmin, builder_params.gemo->GetMeshBoundsMin());
|
||||
rcVcopy(cfg.bmax, builder_params.gemo->GetMeshBoundsMax());
|
||||
}
|
||||
// Init cache
|
||||
rcCalcGridSize(builder_params.gemo->GetMeshBoundsMin(),
|
||||
builder_params.gemo->GetMeshBoundsMax(),
|
||||
builder_params.kCellSize,
|
||||
&builder_params.gw,
|
||||
&builder_params.gh);
|
||||
builder_params.ts = (int)builder_params.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::InitTileCacheParams(BuilderParams& builder_params, dtTileCacheParams& tcparams)
|
||||
@ -97,11 +72,34 @@ void NavMeshBuilder::InitNavMeshParams(BuilderParams& builder_params, dtNavMeshP
|
||||
|
||||
void NavMeshBuilder::BuildTiles(BuilderParams& builder_params)
|
||||
{
|
||||
rcConfig cfg;
|
||||
{
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.cs = builder_params.kCellSize;
|
||||
cfg.ch = builder_params.kCellHeight;
|
||||
cfg.walkableSlopeAngle = builder_params.kAgentMaxSlope;
|
||||
cfg.walkableHeight = (int)ceilf(builder_params.kAgentHeight / cfg.ch);
|
||||
cfg.walkableClimb = (int)floorf(builder_params.kAgentMaxClimb / cfg.ch);
|
||||
cfg.walkableRadius = (int)ceilf(builder_params.kAgentRadius / cfg.cs);
|
||||
cfg.maxEdgeLen = (int)(builder_params.kEdgeMaxLen / builder_params.kCellSize);
|
||||
cfg.maxSimplificationError = builder_params.kEdgeMaxError;
|
||||
cfg.minRegionArea = (int)rcSqr(builder_params.kRegionMinSize); // Note: area = size*size
|
||||
cfg.mergeRegionArea = (int)rcSqr(builder_params.kRegionMergeSize); // Note: area = size*size
|
||||
cfg.maxVertsPerPoly = (int)builder_params.kVertsPerPoly;
|
||||
cfg.tileSize = (int)builder_params.kTileSize;
|
||||
cfg.borderSize = cfg.walkableRadius + 3; // Reserve enough padding.
|
||||
cfg.width = cfg.tileSize + cfg.borderSize*2;
|
||||
cfg.height = cfg.tileSize + cfg.borderSize*2;
|
||||
cfg.detailSampleDist = builder_params.kDetailSampleDist < 0.9f ? 0 : builder_params.kCellSize * builder_params.kDetailSampleDist;
|
||||
cfg.detailSampleMaxError = builder_params.kCellHeight * builder_params.kDetailSampleMaxError;
|
||||
rcVcopy(cfg.bmin, builder_params.gemo->GetMeshBoundsMin());
|
||||
rcVcopy(cfg.bmax, builder_params.gemo->GetMeshBoundsMax());
|
||||
}
|
||||
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);
|
||||
int ntiles = RasterizeTileLayers(x, y, cfg, tiles, MAX_LAYERS);
|
||||
|
||||
for (int i = 0; i < ntiles; ++i) {
|
||||
TileCacheData* tile = &tiles[i];
|
||||
@ -321,14 +319,18 @@ int NavMeshBuilder::RasterizeTileLayers(const int tx, const int ty,
|
||||
|
||||
bool NavMeshBuilder::CreateTileCache(BuilderParams& builder_params)
|
||||
{
|
||||
LinearAllocator* talloc = nullptr;
|
||||
FastLZCompressor* tcomp = nullptr;
|
||||
MeshProcess* tmproc = nullptr;
|
||||
|
||||
dtTileCacheParams tcparams;
|
||||
InitTileCacheParams(builder_params, tcparams);
|
||||
builder_params.tile_cache = dtAllocTileCache();
|
||||
dtStatus status = builder_params.tile_cache->init
|
||||
(&tcparams,
|
||||
builder_params.talloc,
|
||||
builder_params.tcomp,
|
||||
builder_params.tmproc);
|
||||
talloc,
|
||||
tcomp,
|
||||
tmproc);
|
||||
if (dtStatusFailed(status)) {
|
||||
abort();
|
||||
}
|
||||
|
@ -291,12 +291,8 @@ struct BuilderParams
|
||||
int tw = 0;
|
||||
int th = 0;
|
||||
|
||||
InputGeom* gemo = nullptr;
|
||||
rcConfig cfg;
|
||||
MapInstance* map_instance = nullptr;
|
||||
LinearAllocator* talloc = nullptr;
|
||||
FastLZCompressor* tcomp = nullptr;
|
||||
MeshProcess* tmproc = nullptr;
|
||||
dtTileCache* tile_cache = nullptr;
|
||||
InputGeom* gemo = nullptr;
|
||||
dtNavMesh* navmesh = nullptr;
|
||||
dtTileCache* tile_cache = nullptr;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user