This commit is contained in:
aozhiwei 2020-08-14 10:56:42 +08:00
parent deed6b525d
commit 9a91ca6670
3 changed files with 61 additions and 58 deletions

View File

@ -23,50 +23,49 @@ void NavMeshBuilder::UnInit()
dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance) dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance)
{ {
BuilderParams builder_params; BuilderParams builder_params;
InitBasic(builder_params); InitBuilderParams(builder_params);
InitRcConfig(builder_params);
CreateTileCache(builder_params); CreateTileCache(builder_params);
CreateNavMesh(builder_params); CreateNavMesh(builder_params);
BuildTiles(builder_params); BuildTiles(builder_params);
return builder_params.navmesh; return builder_params.navmesh;
} }
void NavMeshBuilder::InitBasic(BuilderParams& builder_params) void NavMeshBuilder::InitBuilderParams(BuilderParams& builder_params)
{ {
// Init cache {
rcCalcGridSize(builder_params.bmin, // Init cache
builder_params.bmax, rcCalcGridSize(builder_params.gemo->GetMeshBoundsMin(),
builder_params.kCellSize, builder_params.gemo->GetMeshBoundsMax(),
&builder_params.gw, builder_params.kCellSize,
&builder_params.gh); &builder_params.gw,
builder_params.ts = (int)builder_params.kTileSize; &builder_params.gh);
builder_params.tw = (builder_params.gw + builder_params.ts-1) / builder_params.ts; builder_params.ts = (int)builder_params.kTileSize;
builder_params.th = (builder_params.gh + builder_params.ts-1) / builder_params.ts; 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;
rcConfig& cfg = builder_params.cfg; memset(&cfg, 0, sizeof(cfg));
memset(&cfg, 0, sizeof(cfg)); cfg.cs = builder_params.kCellSize;
cfg.cs = builder_params.kCellSize; cfg.ch = builder_params.kCellHeight;
cfg.ch = builder_params.kCellHeight; cfg.walkableSlopeAngle = builder_params.kAgentMaxSlope;
cfg.walkableSlopeAngle = builder_params.kAgentMaxSlope; cfg.walkableHeight = (int)ceilf(builder_params.kAgentHeight / cfg.ch);
cfg.walkableHeight = (int)ceilf(builder_params.kAgentHeight / cfg.ch); cfg.walkableClimb = (int)floorf(builder_params.kAgentMaxClimb / cfg.ch);
cfg.walkableClimb = (int)floorf(builder_params.kAgentMaxClimb / cfg.ch); cfg.walkableRadius = (int)ceilf(builder_params.kAgentRadius / cfg.cs);
cfg.walkableRadius = (int)ceilf(builder_params.kAgentRadius / cfg.cs); cfg.maxEdgeLen = (int)(builder_params.kEdgeMaxLen / builder_params.kCellSize);
cfg.maxEdgeLen = (int)(builder_params.kEdgeMaxLen / builder_params.kCellSize); cfg.maxSimplificationError = builder_params.kEdgeMaxError;
cfg.maxSimplificationError = builder_params.kEdgeMaxError; cfg.minRegionArea = (int)rcSqr(builder_params.kRegionMinSize); // Note: area = size*size
cfg.minRegionArea = (int)rcSqr(builder_params.kRegionMinSize); // Note: area = size*size cfg.mergeRegionArea = (int)rcSqr(builder_params.kRegionMergeSize); // Note: area = size*size
cfg.mergeRegionArea = (int)rcSqr(builder_params.kRegionMergeSize); // Note: area = size*size cfg.maxVertsPerPoly = (int)builder_params.kVertsPerPoly;
cfg.maxVertsPerPoly = (int)builder_params.kVertsPerPoly; cfg.tileSize = (int)builder_params.kTileSize;
cfg.tileSize = (int)builder_params.kTileSize; cfg.borderSize = cfg.walkableRadius + 3; // Reserve enough padding.
cfg.borderSize = cfg.walkableRadius + 3; // Reserve enough padding. cfg.width = cfg.tileSize + cfg.borderSize*2;
cfg.width = cfg.tileSize + cfg.borderSize*2; cfg.height = 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.detailSampleDist = builder_params.kDetailSampleDist < 0.9f ? 0 : builder_params.kCellSize * builder_params.kDetailSampleDist; cfg.detailSampleMaxError = builder_params.kCellHeight * builder_params.kDetailSampleMaxError;
cfg.detailSampleMaxError = builder_params.kCellHeight * builder_params.kDetailSampleMaxError; rcVcopy(cfg.bmin, builder_params.gemo->GetMeshBoundsMin());
rcVcopy(cfg.bmin, builder_params.bmin); rcVcopy(cfg.bmax, builder_params.gemo->GetMeshBoundsMax());
rcVcopy(cfg.bmax, builder_params.bmax); }
} }
void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params) void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params)
@ -74,7 +73,7 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params)
dtTileCacheParams& tcparams = builder_params.tcparams; dtTileCacheParams& tcparams = builder_params.tcparams;
// Tile cache params. // Tile cache params.
memset(&tcparams, 0, sizeof(tcparams)); memset(&tcparams, 0, sizeof(tcparams));
rcVcopy(tcparams.orig, builder_params.bmin); rcVcopy(tcparams.orig, builder_params.gemo->GetMeshBoundsMin());
tcparams.cs = builder_params.kCellSize; tcparams.cs = builder_params.kCellSize;
tcparams.ch = builder_params.kCellHeight; tcparams.ch = builder_params.kCellHeight;
tcparams.width = (int)builder_params.kTileSize; tcparams.width = (int)builder_params.kTileSize;
@ -83,14 +82,14 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params)
tcparams.walkableRadius = builder_params.kAgentRadius; tcparams.walkableRadius = builder_params.kAgentRadius;
tcparams.walkableClimb = builder_params.kAgentMaxClimb; tcparams.walkableClimb = builder_params.kAgentMaxClimb;
tcparams.maxSimplificationError = builder_params.kEdgeMaxError; tcparams.maxSimplificationError = builder_params.kEdgeMaxError;
tcparams.maxTiles = builder_params.tw*builder_params.th*EXPECTED_LAYERS_PER_TILE; tcparams.maxTiles = builder_params.tw * builder_params.th * EXPECTED_LAYERS_PER_TILE;
tcparams.maxObstacles = 128; tcparams.maxObstacles = 128;
} }
void NavMeshBuilder::InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params) void NavMeshBuilder::InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params)
{ {
memset(&params, 0, sizeof(params)); memset(&params, 0, sizeof(params));
rcVcopy(params.orig, builder_params.bmin); rcVcopy(params.orig, builder_params.gemo->GetMeshBoundsMin());
params.tileWidth = builder_params.kTileSize * builder_params.kCellSize; params.tileWidth = builder_params.kTileSize * builder_params.kCellSize;
params.tileHeight = builder_params.kTileSize * builder_params.kCellSize; params.tileHeight = builder_params.kTileSize * builder_params.kCellSize;
params.maxTiles = builder_params.kMaxTiles; params.maxTiles = builder_params.kMaxTiles;

View File

@ -20,8 +20,7 @@ public:
dtNavMesh* Build(MapInstance* map_instance); dtNavMesh* Build(MapInstance* map_instance);
private: private:
void InitBasic(BuilderParams& builder_params); void InitBuilderParams(BuilderParams& builder_params);
void InitRcConfig(BuilderParams& builder_params);
void InitTileCacheParams(BuilderParams& builder_params); void InitTileCacheParams(BuilderParams& builder_params);
void InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params); void InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params);
void BuildTiles(BuilderParams& builder_params); void BuildTiles(BuilderParams& builder_params);

View File

@ -246,8 +246,23 @@ struct MeshProcess : public dtTileCacheMeshProcess
} }
}; };
class MapInstance;
class NavMeshHelper
{
public:
static void OutputObjFile(MapInstance* map_instance);
};
class InputGeom
{
public:
const float* GetMeshBoundsMin() const { return nullptr; }
const float* GetMeshBoundsMax() const { return nullptr; }
};
struct BuilderParams struct BuilderParams
{ {
const float kCellSize = 64;
const float kCellHeight = 64; const float kCellHeight = 64;
const float kAgentMaxSlope = 90; const float kAgentMaxSlope = 90;
const float kAgentHeight = 1; const float kAgentHeight = 1;
@ -270,10 +285,13 @@ struct BuilderParams
const int kMaxTiles = 0; const int kMaxTiles = 0;
const int kMaxPolysPerTile = 0; const int kMaxPolysPerTile = 0;
float kCellSize = 64; int gw = 0;
int gh = 0;
int ts = 0;
int tw = 0;
int th = 0;
const float* bmin = nullptr; InputGeom* gemo = nullptr;
const float* bmax = nullptr;
rcConfig cfg; rcConfig cfg;
dtTileCacheParams tcparams; dtTileCacheParams tcparams;
MapInstance* map_instance = nullptr; MapInstance* map_instance = nullptr;
@ -282,17 +300,4 @@ struct BuilderParams
MeshProcess* tmproc = nullptr; MeshProcess* tmproc = nullptr;
dtTileCache* tile_cache = nullptr; dtTileCache* tile_cache = nullptr;
dtNavMesh* navmesh = nullptr; dtNavMesh* navmesh = nullptr;
int gw = 0;
int gh = 0;
int ts = 0;
int tw = 0;
int th = 0;
};
class MapInstance;
class NavMeshHelper
{
public:
static void OutputObjFile(MapInstance* map_instance);
}; };