Tools/mmaps_generator: Made loading vmaps by mmaps_generator threadsafe

This commit is contained in:
Shauren
2022-01-04 22:18:43 +01:00
committed by Ovahlord
parent 267cd04e57
commit 171e6adf19
4 changed files with 61 additions and 24 deletions

View File

@@ -22,8 +22,6 @@
#include "PathCommon.h"
#include "IntermediateValues.h"
#include "StringFormat.h"
#include "VMapFactory.h"
#include "VMapManager2.h"
#include <DetourCommon.h>
#include <DetourNavMesh.h>
#include <DetourNavMeshBuilder.h>
@@ -451,9 +449,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);

View File

@@ -31,6 +31,11 @@
#include <errno.h>
#endif
namespace VMAP
{
class VMapManager2;
}
namespace MMAP
{
inline bool matchWildcardFilter(char const* filter, char const* str)
@@ -118,6 +123,21 @@ namespace MMAP
return LISTFILE_OK;
}
struct MapEntry
{
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

View File

@@ -21,18 +21,38 @@
#include "MapBuilder.h"
#include "Timer.h"
#include "Util.h"
#include "VMapFactory.h"
#include "VMapManager2.h"
#include <boost/filesystem/operations.hpp>
#include <unordered_map>
using namespace MMAP;
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;
bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales)
{
if (getDirContents(dbcLocales, "dbc") == LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty())
@@ -310,6 +330,12 @@ std::unordered_map<uint32, std::vector<uint32>> LoadMap(std::string const& local
int16 parentMapId = int16(record.getUInt(19));
if (parentMapId != -1)
mapData[parentMapId].push_back(record.getUInt(0));
MapEntry& map = sMapStore[record.getUInt(0)];
map.MapType = record.getUInt8(4);
map.InstanceType = record.getUInt8(2);
map.ParentMapID = parentMapId;
map.Flags = record.getInt(3);
}
}
@@ -363,16 +389,7 @@ int main(int argc, char** argv)
if (_liquidTypes.empty())
return silent ? -5 : finish("Failed to load LiquidType.dbc", -5);
std::unordered_map<uint32, std::vector<uint32>> mapData = LoadMap(dbcLocales[0]);
if (mapData.empty())
return silent ? -4 : finish("Failed to load Map.dbc", -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]);
MapBuilder builder(maxAngle, maxAngleNotSteep, skipLiquid, skipContinents, skipJunkMaps,
skipBattlegrounds, debugOutput, bigBaseUnit, mapnum, offMeshInputPath);
@@ -387,8 +404,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;

View File

@@ -20,7 +20,6 @@
#include "MapDefines.h"
#include "MapTree.h"
#include "ModelInstance.h"
#include "VMapFactory.h"
#include "VMapManager2.h"
#include <map>
@@ -138,11 +137,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/%03u%02u%02u.map", parentMapId, tileY, tileX);
mapFile = fopen(mapFileName, "rb");
parentMapId = sMapStore[parentMapId].ParentMapID;
}
}
@@ -639,7 +639,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();
int result = vmapManager->loadSingleMap(mapID, "vmaps", tileX, tileY);
bool retval = false;