From 9a91ca6670c2627b1025fb6059c0d3314bd891f9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 14 Aug 2020 10:56:42 +0800 Subject: [PATCH] 1 --- server/gameserver/navmeshbuilder.cc | 79 ++++++++++++++--------------- server/gameserver/navmeshbuilder.h | 3 +- server/gameserver/navmeshhelper.h | 37 ++++++++------ 3 files changed, 61 insertions(+), 58 deletions(-) diff --git a/server/gameserver/navmeshbuilder.cc b/server/gameserver/navmeshbuilder.cc index 7fb39fe..df9d241 100644 --- a/server/gameserver/navmeshbuilder.cc +++ b/server/gameserver/navmeshbuilder.cc @@ -23,50 +23,49 @@ void NavMeshBuilder::UnInit() dtNavMesh* NavMeshBuilder::Build(MapInstance* map_instance) { BuilderParams builder_params; - InitBasic(builder_params); - InitRcConfig(builder_params); + InitBuilderParams(builder_params); CreateTileCache(builder_params); CreateNavMesh(builder_params); BuildTiles(builder_params); return builder_params.navmesh; } -void NavMeshBuilder::InitBasic(BuilderParams& builder_params) +void NavMeshBuilder::InitBuilderParams(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)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::InitRcConfig(BuilderParams& builder_params) -{ - 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.bmin); - rcVcopy(cfg.bmax, builder_params.bmax); + { + // 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()); + } } void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params) @@ -74,7 +73,7 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params) dtTileCacheParams& tcparams = builder_params.tcparams; // Tile cache params. memset(&tcparams, 0, sizeof(tcparams)); - rcVcopy(tcparams.orig, builder_params.bmin); + rcVcopy(tcparams.orig, builder_params.gemo->GetMeshBoundsMin()); tcparams.cs = builder_params.kCellSize; tcparams.ch = builder_params.kCellHeight; tcparams.width = (int)builder_params.kTileSize; @@ -83,14 +82,14 @@ void NavMeshBuilder::InitTileCacheParams(BuilderParams& builder_params) tcparams.walkableRadius = builder_params.kAgentRadius; tcparams.walkableClimb = builder_params.kAgentMaxClimb; 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; } void NavMeshBuilder::InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& 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.tileHeight = builder_params.kTileSize * builder_params.kCellSize; params.maxTiles = builder_params.kMaxTiles; diff --git a/server/gameserver/navmeshbuilder.h b/server/gameserver/navmeshbuilder.h index 1fcf6dc..c2a5270 100644 --- a/server/gameserver/navmeshbuilder.h +++ b/server/gameserver/navmeshbuilder.h @@ -20,8 +20,7 @@ public: dtNavMesh* Build(MapInstance* map_instance); private: - void InitBasic(BuilderParams& builder_params); - void InitRcConfig(BuilderParams& builder_params); + void InitBuilderParams(BuilderParams& builder_params); void InitTileCacheParams(BuilderParams& builder_params); void InitNavMeshParams(BuilderParams& builder_params, dtNavMeshParams& params); void BuildTiles(BuilderParams& builder_params); diff --git a/server/gameserver/navmeshhelper.h b/server/gameserver/navmeshhelper.h index 260299c..72765d8 100644 --- a/server/gameserver/navmeshhelper.h +++ b/server/gameserver/navmeshhelper.h @@ -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 { + const float kCellSize = 64; const float kCellHeight = 64; const float kAgentMaxSlope = 90; const float kAgentHeight = 1; @@ -270,10 +285,13 @@ struct BuilderParams const int kMaxTiles = 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; - const float* bmax = nullptr; + InputGeom* gemo = nullptr; rcConfig cfg; dtTileCacheParams tcparams; MapInstance* map_instance = nullptr; @@ -282,17 +300,4 @@ struct BuilderParams MeshProcess* tmproc = nullptr; dtTileCache* tile_cache = 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); };