From 07b134b10b7a35b9729ee94002c94dab71ec4a0a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 14 Aug 2020 14:25:14 +0800 Subject: [PATCH] 1 --- server/gameserver/navmeshbuilder.cc | 78 +++++++++++++++-------------- server/gameserver/navmeshhelper.h | 8 +-- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/server/gameserver/navmeshbuilder.cc b/server/gameserver/navmeshbuilder.cc index 1d69eab..ef64a5b 100644 --- a/server/gameserver/navmeshbuilder.cc +++ b/server/gameserver/navmeshbuilder.cc @@ -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(); } diff --git a/server/gameserver/navmeshhelper.h b/server/gameserver/navmeshhelper.h index 802a845..6396856 100644 --- a/server/gameserver/navmeshhelper.h +++ b/server/gameserver/navmeshhelper.h @@ -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; };