diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-01-04 20:41:52 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-01-04 20:44:22 +0100 |
commit | 1d0ca1106f97c8631376a5ab0a7ab9e3d4383a16 (patch) | |
tree | 70897ae902c43b160a3828e8e4aba96582c9baa3 /src | |
parent | 3820aabcd8874e51e42ac305ef9de551e8b22175 (diff) |
Tools/mmaps_generator: Made loading vmaps by mmaps_generator threadsafe
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/mmaps_generator/MapBuilder.cpp | 12 | ||||
-rw-r--r-- | src/tools/mmaps_generator/PathCommon.h | 11 | ||||
-rw-r--r-- | src/tools/mmaps_generator/PathGenerator.cpp | 39 | ||||
-rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.cpp | 8 |
4 files changed, 45 insertions, 25 deletions
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 8a33fd61210..86fb194997c 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -22,8 +22,6 @@ #include "ModelInstance.h" #include "PathCommon.h" #include "StringFormat.h" -#include "VMapFactory.h" -#include "VMapManager2.h" #include <DetourCommon.h> #include <DetourNavMesh.h> #include <DetourNavMeshBuilder.h> @@ -448,9 +446,13 @@ namespace MMAP void MapBuilder::buildNavMesh(uint32 mapID, dtNavMesh* &navMesh) { // if map has a parent we use that to generate dtNavMeshParams - worldserver will load all missing tiles from that map - int32 navMeshParamsMapId = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager())->getParentMapId(mapID); - if (navMeshParamsMapId == -1) - navMeshParamsMapId = mapID; + int32 navMeshParamsMapId = mapID; + int32 parentMapId = sMapStore[mapID].ParentMapID; + while (parentMapId != -1) + { + navMeshParamsMapId = parentMapId; + parentMapId = sMapStore[parentMapId].ParentMapID; + } std::set<uint32>* tiles = getTileList(navMeshParamsMapId); diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index 173f091e2ac..fed5698b119 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -35,6 +35,11 @@ #include <cerrno> #endif +namespace VMAP +{ + class VMapManager2; +} + namespace MMAP { inline bool matchWildcardFilter(char const* filter, char const* str) @@ -127,10 +132,16 @@ namespace MMAP { uint8 MapType = 0; int8 InstanceType = 0; + int16 ParentMapID = -1; int32 Flags = 0; }; extern std::unordered_map<uint32, MapEntry> sMapStore; + + namespace VMapFactory + { + std::unique_ptr<VMAP::VMapManager2> CreateVMapManager(); +} } #endif diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp index b927cf067f5..abc115ce159 100644 --- a/src/tools/mmaps_generator/PathGenerator.cpp +++ b/src/tools/mmaps_generator/PathGenerator.cpp @@ -23,7 +23,6 @@ #include "PathCommon.h" #include "Timer.h" #include "Util.h" -#include "VMapFactory.h" #include "VMapManager2.h" #include <boost/filesystem/operations.hpp> #include <unordered_map> @@ -34,18 +33,34 @@ constexpr char Readme[] = #include "Info/readme.txt" }; +namespace +{ + std::unordered_map<uint32, uint8> _liquidTypes; + std::unordered_map<uint32, std::vector<uint32>> _mapDataForVmapInitialization; +} + namespace MMAP { std::unordered_map<uint32, MapEntry> sMapStore; + + namespace VMapFactory + { + std::unique_ptr<VMAP::VMapManager2> CreateVMapManager() + { + std::unique_ptr<VMAP::VMapManager2> vmgr = std::make_unique<VMAP::VMapManager2>(); + vmgr->InitializeThreadUnsafe(_mapDataForVmapInitialization); + vmgr->GetLiquidFlagsPtr = [](uint32 liquidId) -> uint32 + { + auto itr = _liquidTypes.find(liquidId); + return itr != _liquidTypes.end() ? (1 << itr->second) : 0; + }; + return vmgr; + } + } } using namespace MMAP; -namespace -{ - std::unordered_map<uint32, uint8> _liquidTypes; -} - bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales) { if (getDirContents(dbcLocales, "dbc") == LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty()) @@ -346,6 +361,7 @@ std::unordered_map<uint32, std::vector<uint32>> LoadMap(std::string const& local MapEntry& map = sMapStore[record.GetId()]; map.MapType = record.GetUInt8("MapType"); map.InstanceType = record.GetUInt8("InstanceType"); + map.ParentMapID = parentMapId; map.Flags = record.GetInt32("Flags1"); } } @@ -404,14 +420,7 @@ int main(int argc, char** argv) _liquidTypes = LoadLiquid(dbcLocales[0], silent, -5); - std::unordered_map<uint32, std::vector<uint32>> mapData = LoadMap(dbcLocales[0], silent, -4); - - static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->InitializeThreadUnsafe(mapData); - static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->GetLiquidFlagsPtr = [](uint32 liquidId) -> uint32 - { - auto itr = _liquidTypes.find(liquidId); - return itr != _liquidTypes.end() ? (1 << itr->second) : 0; - }; + _mapDataForVmapInitialization = LoadMap(dbcLocales[0], silent, -4); MapBuilder builder(maxAngle, maxAngleNotSteep, skipLiquid, skipContinents, skipJunkMaps, skipBattlegrounds, debugOutput, bigBaseUnit, mapnum, offMeshInputPath); @@ -426,8 +435,6 @@ int main(int argc, char** argv) else builder.buildAllMaps(threads); - VMAP::VMapFactory::clear(); - if (!silent) printf("Finished. MMAPS were built in %s\n", secsToTimeString(GetMSTimeDiffToNow(start) / 1000).c_str()); return 0; diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 10de95f15cb..22127611fc3 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -22,7 +22,6 @@ #include "MMapDefines.h" #include "ModelInstance.h" #include "Util.h" -#include "VMapFactory.h" #include "VMapManager2.h" namespace MMAP @@ -86,11 +85,12 @@ namespace MMAP FILE* mapFile = fopen(mapFileName, "rb"); if (!mapFile) { - int32 parentMapId = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager())->getParentMapId(mapID); - if (parentMapId != -1) + int32 parentMapId = sMapStore[mapID].ParentMapID; + while (!mapFile && parentMapId != -1) { sprintf(mapFileName, "maps/%04d_%02u_%02u.map", parentMapId, tileY, tileX); mapFile = fopen(mapFileName, "rb"); + parentMapId = sMapStore[parentMapId].ParentMapID; } } @@ -587,7 +587,7 @@ namespace MMAP /**************************************************************************/ bool TerrainBuilder::loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData) { - VMapManager2* vmapManager = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager()); + std::unique_ptr<VMapManager2> vmapManager = VMapFactory::CreateVMapManager(); LoadResult result = vmapManager->loadSingleMap(mapID, "vmaps", tileX, tileY); bool retval = false; |