This commit is contained in:
aozhiwei 2020-08-18 14:50:34 +08:00
parent dfb6837666
commit c45c43d7fa
3 changed files with 30 additions and 13 deletions

View File

@ -52,6 +52,9 @@ void MapService::Init(int width, int height, int cell_width)
if (width < 1 || height < 1 || cell_width < 1) { if (width < 1 || height < 1 || cell_width < 1) {
abort(); abort();
} }
#ifdef FIND_PATH_TEST
use_navmesh_ = true;
#endif
map_width_ = width; map_width_ = width;
map_height_ = height; map_height_ = height;
cell_width_ = cell_width; cell_width_ = cell_width;

View File

@ -27,7 +27,10 @@ void NavMeshBuilder::Build(MapInstance* map_instance)
BuilderParams builder_params; BuilderParams builder_params;
{ {
builder_params.map_instance = map_instance; builder_params.map_instance = map_instance;
builder_params.gemo = new f8::InputGeom(); builder_params.geom = new f8::InputGeom();
builder_params.geom->Init(map_instance->map_meta_->i->map_width(),
map_instance->map_meta_->i->map_height());
builder_params.ctx = new BuildContext();
} }
InitBuilderParams(builder_params); InitBuilderParams(builder_params);
CreateTileCache(builder_params); CreateTileCache(builder_params);
@ -39,8 +42,8 @@ void NavMeshBuilder::Build(MapInstance* map_instance)
void NavMeshBuilder::InitBuilderParams(BuilderParams& builder_params) void NavMeshBuilder::InitBuilderParams(BuilderParams& builder_params)
{ {
// Init cache // Init cache
rcCalcGridSize(builder_params.gemo->GetMeshBoundsMin(), rcCalcGridSize(builder_params.geom->GetMeshBoundsMin(),
builder_params.gemo->GetMeshBoundsMax(), builder_params.geom->GetMeshBoundsMax(),
builder_params.kCellSize, builder_params.kCellSize,
&builder_params.grid_width, &builder_params.grid_width,
&builder_params.grid_height); &builder_params.grid_height);
@ -55,7 +58,7 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params, dtTileCa
{ {
// Tile cache params. // Tile cache params.
memset(&tcparams, 0, sizeof(tcparams)); memset(&tcparams, 0, sizeof(tcparams));
rcVcopy(tcparams.orig, builder_params.gemo->GetMeshBoundsMin()); rcVcopy(tcparams.orig, builder_params.geom->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;
@ -71,7 +74,7 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params, dtTileCa
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.gemo->GetMeshBoundsMin()); rcVcopy(params.orig, builder_params.geom->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;
#if 1 #if 1
@ -112,8 +115,8 @@ void NavMeshBuilder::BuildTiles(BuilderParams& builder_params)
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.geom->GetMeshBoundsMin());
rcVcopy(cfg.bmax, builder_params.gemo->GetMeshBoundsMax()); rcVcopy(cfg.bmax, builder_params.geom->GetMeshBoundsMax());
} }
for (int y = 0; y < builder_params.tile_height; ++y) { for (int y = 0; y < builder_params.tile_height; ++y) {
@ -157,9 +160,9 @@ int NavMeshBuilder::RasterizeTileLayers(BuilderParams& builder_params,
FastLZCompressor comp; FastLZCompressor comp;
RasterizationContext rc; RasterizationContext rc;
const float* verts = builder_params.gemo->GetVerts(); const float* verts = builder_params.geom->GetVerts();
const int nverts = builder_params.gemo->GetVertCount(); const int nverts = builder_params.geom->GetVertCount();
const rcChunkyTriMesh* chunkyMesh = builder_params.gemo->GetChunkyMesh(); const rcChunkyTriMesh* chunkyMesh = builder_params.geom->GetChunkyMesh();
// Tile bounds. // Tile bounds.
const float tcs = cfg.tileSize * cfg.cs; const float tcs = cfg.tileSize * cfg.cs;
@ -273,8 +276,8 @@ int NavMeshBuilder::RasterizeTileLayers(BuilderParams& builder_params,
#if 0 #if 0
// (Optional) Mark areas. // (Optional) Mark areas.
const ConvexVolume* vols = builder_params.gemo->GetConvexVolumes(); const ConvexVolume* vols = builder_params.geom->GetConvexVolumes();
for (int i = 0; i < builder_params.gemo->GetConvexVolumeCount(); ++i) { for (int i = 0; i < builder_params.geom->GetConvexVolumeCount(); ++i) {
rcMarkConvexPolyArea(builder_params.ctx, vols[i].verts, vols[i].nverts, rcMarkConvexPolyArea(builder_params.ctx, vols[i].verts, vols[i].nverts,
vols[i].hmin, vols[i].hmax, vols[i].hmin, vols[i].hmax,
vols[i].areaMod, *rc.chf); vols[i].areaMod, *rc.chf);

View File

@ -171,6 +171,17 @@ struct MeshProcess : public dtTileCacheMeshProcess
} }
}; };
class BuildContext : public rcContext
{
protected:
virtual void doResetLog() {}
virtual void doLog(const rcLogCategory category, const char* msg, const int len) {}
virtual void doResetTimers() {}
virtual void doStartTimer(const rcTimerLabel label) {}
virtual void doStopTimer(const rcTimerLabel label) {}
virtual int doGetAccumulatedTime(const rcTimerLabel label) const { return 0;}
};
class MapInstance; class MapInstance;
class NavMeshHelper class NavMeshHelper
{ {
@ -235,7 +246,7 @@ struct BuilderParams
int tile_height = 0; int tile_height = 0;
MapInstance* map_instance = nullptr; MapInstance* map_instance = nullptr;
f8::InputGeom* gemo = nullptr; f8::InputGeom* geom = nullptr;
dtNavMesh* navmesh = nullptr; dtNavMesh* navmesh = nullptr;
rcContext* ctx = nullptr; rcContext* ctx = nullptr;
dtTileCache* tile_cache = nullptr; dtTileCache* tile_cache = nullptr;