diff options
| -rw-r--r-- | src/tools/mmaps_generator/IntermediateValues.h | 34 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/MapBuilder.cpp | 4 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/TileBuilder.cpp | 74 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/TileBuilder.h | 15 |
4 files changed, 91 insertions, 36 deletions
diff --git a/src/tools/mmaps_generator/IntermediateValues.h b/src/tools/mmaps_generator/IntermediateValues.h index 5620152c15f..75ade2259e3 100644 --- a/src/tools/mmaps_generator/IntermediateValues.h +++ b/src/tools/mmaps_generator/IntermediateValues.h @@ -18,8 +18,9 @@ #ifndef _INTERMEDIATE_VALUES_H #define _INTERMEDIATE_VALUES_H -#include "Recast.h" #include "TerrainBuilder.h" +#include <Recast.h> +#include <utility> namespace MMAP { @@ -32,10 +33,37 @@ namespace MMAP rcPolyMesh* polyMesh; rcPolyMeshDetail* polyMeshDetail; - IntermediateValues() : heightfield(nullptr), compactHeightfield(nullptr), - contours(nullptr), polyMesh(nullptr), polyMeshDetail(nullptr) {} + IntermediateValues() : heightfield(nullptr), compactHeightfield(nullptr), + contours(nullptr), polyMesh(nullptr), polyMeshDetail(nullptr) {} + + IntermediateValues(IntermediateValues const&) = delete; + + IntermediateValues(IntermediateValues&& other) noexcept : + heightfield(std::exchange(other.heightfield, nullptr)), + compactHeightfield(std::exchange(other.compactHeightfield, nullptr)), + contours(std::exchange(other.contours, nullptr)), + polyMesh(std::exchange(other.polyMesh, nullptr)), + polyMeshDetail(std::exchange(other.polyMeshDetail, nullptr)) + { + } + ~IntermediateValues(); + IntermediateValues& operator=(IntermediateValues const&) = delete; + + IntermediateValues& operator=(IntermediateValues&& other) noexcept + { + if (this != std::addressof(other)) + { + heightfield = std::exchange(other.heightfield, nullptr); + compactHeightfield = std::exchange(other.compactHeightfield, nullptr); + contours = std::exchange(other.contours, nullptr); + polyMesh = std::exchange(other.polyMesh, nullptr); + polyMeshDetail = std::exchange(other.polyMeshDetail, nullptr); + } + return *this; + } + void writeIV(uint32 mapID, uint32 tileX, uint32 tileY); void debugWrite(FILE* file, rcHeightfield const* mesh); diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 958542b1432..f6bc2ed47cb 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -328,7 +328,9 @@ namespace MMAP // build navmesh tile MapTileBuilder tileBuilder(this, m_maxWalkableAngle, m_maxWalkableAngleNotSteep, m_skipLiquid, m_bigBaseUnit, m_debugOutput, &m_offMeshConnections); - tileBuilder.buildMoveMapTile(mapId, tileX, tileY, data, bmin, bmax, navMesh); + TileBuilder::TileResult tileResult = tileBuilder.buildMoveMapTile(mapId, tileX, tileY, data, bmin, bmax, navMesh->getParams()); + if (tileResult.data) + tileBuilder.saveMoveMapTileToFile(mapId, tileX, tileY, navMesh, tileResult); } /**************************************************************************/ diff --git a/src/tools/mmaps_generator/TileBuilder.cpp b/src/tools/mmaps_generator/TileBuilder.cpp index 4b0220e97a1..eff2f7bcf59 100644 --- a/src/tools/mmaps_generator/TileBuilder.cpp +++ b/src/tools/mmaps_generator/TileBuilder.cpp @@ -135,20 +135,24 @@ namespace MMAP m_terrainBuilder.loadOffMeshConnections(mapID, tileX, tileY, meshData, *m_offMeshConnections); // build navmesh tile - buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh); + TileResult tileResult = buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh->getParams()); + if (tileResult.data) + saveMoveMapTileToFile(mapID, tileX, tileY, navMesh, tileResult); OnTileDone(); } /**************************************************************************/ - void TileBuilder::buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY, + TileBuilder::TileResult TileBuilder::buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, float (&bmin)[3], float (&bmax)[3], - dtNavMesh* navMesh) + dtNavMeshParams const* navMeshParams) { // console output std::string tileString = Trinity::StringFormat("[Map {:04}] [{:02},{:02}]:", mapID, tileX, tileY); TC_LOG_INFO("maps.mmapgen", "{} Building movemap tile...", tileString); + TileResult tileResult; + IntermediateValues iv; float* tVerts = meshData.solidVerts.data(); @@ -304,7 +308,7 @@ namespace MMAP if (!iv.polyMesh) { TC_LOG_ERROR("maps.mmapgen", "{} alloc iv.polyMesh FAILED!", tileString); - return; + return tileResult; } rcMergePolyMeshes(&m_rcContext, pmmerge.get(), nmerge, *iv.polyMesh); @@ -312,7 +316,7 @@ namespace MMAP if (!iv.polyMeshDetail) { TC_LOG_ERROR("maps.mmapgen", "{} alloc m_dmesh FAILED!", tileString); - return; + return tileResult; } rcMergePolyMeshDetails(&m_rcContext, dmmerge.get(), nmerge, *iv.polyMeshDetail); @@ -359,8 +363,8 @@ namespace MMAP params.walkableHeight = BASE_UNIT_DIM * config.walkableHeight; // agent height params.walkableRadius = BASE_UNIT_DIM * config.walkableRadius; // agent radius params.walkableClimb = BASE_UNIT_DIM * config.walkableClimb; // keep less that walkableHeight (aka agent height)! - params.tileX = (((bmin[0] + bmax[0]) / 2) - navMesh->getParams()->orig[0]) / GRID_SIZE; - params.tileY = (((bmin[2] + bmax[2]) / 2) - navMesh->getParams()->orig[2]) / GRID_SIZE; + params.tileX = (((bmin[0] + bmax[0]) / 2) - navMeshParams->orig[0]) / GRID_SIZE; + params.tileY = (((bmin[2] + bmax[2]) / 2) - navMeshParams->orig[2]) / GRID_SIZE; rcVcopy(params.bmin, bmin); rcVcopy(params.bmax, bmax); params.cs = config.cs; @@ -370,7 +374,6 @@ namespace MMAP // will hold final navmesh unsigned char* navData = nullptr; - int navDataSize = 0; auto debugOutputWriter = Trinity::make_unique_ptr_with_deleter(m_debugOutput ? &iv : nullptr, [=, borderSize = static_cast<unsigned short>(config.borderSize), &meshData](IntermediateValues* intermediate) { @@ -391,13 +394,13 @@ namespace MMAP if (params.nvp > DT_VERTS_PER_POLYGON) { TC_LOG_ERROR("maps.mmapgen", "{} Invalid verts-per-polygon value!", tileString); - return; + return tileResult; } if (params.vertCount >= 0xffff) { TC_LOG_ERROR("maps.mmapgen", "{} Too many vertices!", tileString); - return; + return tileResult; } if (!params.vertCount || !params.verts) @@ -407,7 +410,7 @@ namespace MMAP // message is an annoyance //TC_LOG_ERROR("maps.mmapgen", "{} No vertices to build tile!", tileString); - return; + return tileResult; } if (!params.polyCount || !params.polys) @@ -415,57 +418,68 @@ namespace MMAP // we have flat tiles with no actual geometry - don't build those, its useless // keep in mind that we do output those into debug info TC_LOG_ERROR("maps.mmapgen", "{} No polygons to build on tile!", tileString); - return; + return tileResult; } if (!params.detailMeshes || !params.detailVerts || !params.detailTris) { TC_LOG_ERROR("maps.mmapgen", "{} No detail mesh to build tile!", tileString); - return; + return tileResult; } TC_LOG_DEBUG("maps.mmapgen", "{} Building navmesh tile...", tileString); - if (!dtCreateNavMeshData(¶ms, &navData, &navDataSize)) + if (!dtCreateNavMeshData(¶ms, &navData, &tileResult.size)) { TC_LOG_ERROR("maps.mmapgen", "{} Failed building navmesh tile!", tileString); - return; + return tileResult; } - dtTileRef tileRef = 0; - TC_LOG_DEBUG("maps.mmapgen", "{} Adding tile to navmesh...", tileString); - // DT_TILE_FREE_DATA tells detour to unallocate memory when the tile - // is removed via removeTile() - dtStatus dtResult = navMesh->addTile(navData, navDataSize, DT_TILE_FREE_DATA, 0, &tileRef); - if (!tileRef || !dtStatusSucceed(dtResult)) - { - TC_LOG_ERROR("maps.mmapgen", "{} Failed adding tile to navmesh!", tileString); - return; - } + tileResult.data.reset(navData); + return tileResult; + } - auto navMeshTile = Trinity::make_unique_ptr_with_deleter(&tileRef, [navMesh](dtTileRef const* ref) + void TileBuilder::saveMoveMapTileToFile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh, TileResult const& tileResult) + { + dtTileRef tileRef = 0; + auto navMeshTile = Trinity::make_unique_ptr_with_deleter<dtTileRef*>(nullptr, [navMesh](dtTileRef const* ref) { navMesh->removeTile(*ref, nullptr, nullptr); }); + if (navMesh) + { + TC_LOG_DEBUG("maps.mmapgen", "[Map {:04}] [{:02},{:02}]: Adding tile to navmesh...", mapID, tileX, tileY); + // DT_TILE_FREE_DATA tells detour to unallocate memory when the tile + // is removed via removeTile() + dtStatus dtResult = navMesh->addTile(tileResult.data.get(), tileResult.size, 0, 0, &tileRef); + if (!tileRef || !dtStatusSucceed(dtResult)) + { + TC_LOG_ERROR("maps.mmapgen", "[Map {:04}] [{:02},{:02}]: Failed adding tile to navmesh!", mapID, tileX, tileY); + return; + } + + navMeshTile.reset(&tileRef); + } + // file output std::string fileName = Trinity::StringFormat("mmaps/{:04}{:02}{:02}.mmtile", mapID, tileX, tileY); auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "wb")); if (!file) { - TC_LOG_ERROR("maps.mmapgen", "{}: [Map {:04}] Failed to open {} for writing!", strerror(errno), mapID, fileName); + TC_LOG_ERROR("maps.mmapgen", "[Map {:04}] [{:02},{:02}]: {}: Failed to open {} for writing!", mapID, tileX, tileY, strerror(errno), fileName); return; } - TC_LOG_DEBUG("maps.mmapgen", "{} Writing to file...", tileString); + TC_LOG_DEBUG("maps.mmapgen", "[Map {:04}] [{:02},{:02}]: Writing to file...", mapID, tileX, tileY); // write header MmapTileHeader header; header.usesLiquids = m_terrainBuilder.usesLiquids(); - header.size = uint32(navDataSize); + header.size = uint32(tileResult.size); fwrite(&header, sizeof(MmapTileHeader), 1, file.get()); // write data - fwrite(navData, sizeof(unsigned char), navDataSize, file.get()); + fwrite(tileResult.data.get(), sizeof(unsigned char), tileResult.size, file.get()); } /**************************************************************************/ diff --git a/src/tools/mmaps_generator/TileBuilder.h b/src/tools/mmaps_generator/TileBuilder.h index 4ebbe38a037..f533a3d1afa 100644 --- a/src/tools/mmaps_generator/TileBuilder.h +++ b/src/tools/mmaps_generator/TileBuilder.h @@ -19,6 +19,7 @@ #define TRINITYCORE_TILE_BUILDER_H #include "Define.h" +#include "Memory.h" #include "StringFormat.h" #include "TerrainBuilder.h" #include <DetourNavMesh.h> @@ -28,6 +29,8 @@ namespace MMAP { struct TileConfig; +using detour_unique_ptr = std::unique_ptr<unsigned char, decltype(Trinity::unique_ptr_deleter<unsigned char*, &::dtFree>())>; + class TileBuilder { public: @@ -47,14 +50,22 @@ public: virtual ~TileBuilder(); void buildTile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh); + // move map building - void buildMoveMapTile(uint32 mapID, + struct TileResult + { + detour_unique_ptr data; + int size = 0; + }; + TileResult buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, float (&bmin)[3], float (&bmax)[3], - dtNavMesh* navMesh); + dtNavMeshParams const* navMeshParams); + + void saveMoveMapTileToFile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh, TileResult const& tileResult); virtual bool shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY) const; |
