1
This commit is contained in:
parent
deed6b525d
commit
9a91ca6670
@ -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(¶ms, 0, sizeof(params));
|
memset(¶ms, 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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user