AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MMAP::MapBuilder Class Reference

#include "MapBuilder.h"

Public Member Functions

 MapBuilder (Config *config, int mapid, char const *offMeshFilePath, unsigned int threads)
 
 ~MapBuilder ()
 
void buildMeshFromFile (char *name)
 
void buildSingleTile (uint32 mapID, uint32 tileX, uint32 tileY)
 
void buildMaps (Optional< uint32 > mapID)
 
const ConfiggetConfig () const
 

Private Member Functions

void buildMap (uint32 mapID)
 
void discoverTiles ()
 
std::set< uint32 > * getTileList (uint32 mapID)
 
void buildNavMesh (uint32 mapID, dtNavMesh *&navMesh)
 
void getTileBounds (uint32 tileX, uint32 tileY, float *verts, int vertCount, float *bmin, float *bmax) const
 
void getGridBounds (uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY) const
 
bool shouldSkipMap (uint32 mapID) const
 
bool isTransportMap (uint32 mapID) const
 
bool isContinentMap (uint32 mapID) const
 
rcConfig getRecastConfig (const ResolvedMeshConfig &cfg, float bmin[3], float bmax[3]) const
 
uint32 percentageDone (uint32 totalTiles, uint32 totalTilesDone) const
 
uint32 currentPercentageDone () const
 

Private Attributes

TerrainBuilderm_terrainBuilder {nullptr}
 
TileList m_tiles
 
bool m_debugOutput
 
const char * m_offMeshFilePath
 
unsigned int m_threads
 
bool m_skipContinents
 
bool m_skipJunkMaps
 
bool m_skipBattlegrounds
 
bool m_skipLiquid
 
int32 m_mapid
 
Configm_config
 
std::atomic< uint32m_totalTiles
 
std::atomic< uint32m_totalTilesProcessed
 
rcContext * m_rcContext {nullptr}
 
std::vector< TileBuilder * > m_tileBuilders
 
ProducerConsumerQueue< TileInfo_queue
 
std::atomic< bool > _cancelationToken
 

Friends

class TileBuilder
 

Detailed Description

Constructor & Destructor Documentation

◆ MapBuilder()

MMAP::MapBuilder::MapBuilder ( Config config,
int  mapid,
char const *  offMeshFilePath,
unsigned int  threads 
)
58 :
59 m_config (config),
60 m_debugOutput (config->IsDebugOutputEnabled()),
61 m_offMeshFilePath (offMeshFilePath),
62 m_threads (threads),
63 m_skipContinents (config->ShouldSkipContinents()),
64 m_skipJunkMaps (config->ShouldSkipJunkMaps()),
65 m_skipBattlegrounds (config->ShouldSkipBattlegrounds()),
66 m_skipLiquid (config->ShouldSkipLiquid()),
67 m_mapid (mapid),
68 m_totalTiles (0u),
70
71 _cancelationToken (false)
72 {
73 m_terrainBuilder = new TerrainBuilder(config->DataDirPath(), config->ShouldSkipLiquid());
74
75 m_rcContext = new rcContext(false);
76
77 // At least 1 thread is needed
78 m_threads = std::max(1u, m_threads);
79
81 }
const char * m_offMeshFilePath
Definition MapBuilder.h:170
int32 m_mapid
Definition MapBuilder.h:177
Config * m_config
Definition MapBuilder.h:179
bool m_skipContinents
Definition MapBuilder.h:172
void discoverTiles()
Definition MapBuilder.cpp:97
bool m_skipLiquid
Definition MapBuilder.h:175
std::atomic< uint32 > m_totalTiles
Definition MapBuilder.h:181
rcContext * m_rcContext
Definition MapBuilder.h:185
std::atomic< bool > _cancelationToken
Definition MapBuilder.h:189
bool m_skipBattlegrounds
Definition MapBuilder.h:174
bool m_skipJunkMaps
Definition MapBuilder.h:173
std::atomic< uint32 > m_totalTilesProcessed
Definition MapBuilder.h:182
bool m_debugOutput
Definition MapBuilder.h:168
TerrainBuilder * m_terrainBuilder
Definition MapBuilder.h:165
unsigned int m_threads
Definition MapBuilder.h:171

References MMAP::Config::DataDirPath(), discoverTiles(), m_rcContext, m_terrainBuilder, m_threads, and MMAP::Config::ShouldSkipLiquid().

◆ ~MapBuilder()

MMAP::MapBuilder::~MapBuilder ( )
85 {
86 for (auto & m_tile : m_tiles)
87 {
88 m_tile.m_tiles->clear();
89 delete m_tile.m_tiles;
90 }
91
92 delete m_terrainBuilder;
93 delete m_rcContext;
94 }
TileList m_tiles
Definition MapBuilder.h:166

References m_rcContext, m_terrainBuilder, and m_tiles.

Member Function Documentation

◆ buildMap()

void MMAP::MapBuilder::buildMap ( uint32  mapID)
private
420 {
421 std::set<uint32>* tiles = getTileList(mapID);
422
423 if (!tiles->empty())
424 {
425 // build navMesh
426 dtNavMesh* navMesh = nullptr;
427 buildNavMesh(mapID, navMesh);
428 if (!navMesh)
429 {
430 printf("[Map %03i] Failed creating navmesh!\n", mapID);
431 m_totalTilesProcessed += tiles->size();
432 return;
433 }
434
435 // now start building mmtiles for each tile
436 printf("[Map %03i] We have %u tiles. \n", mapID, (unsigned int)tiles->size());
437 for (unsigned int tile : *tiles)
438 {
439 uint32 tileX, tileY;
440
441 // unpack tile coords
442 StaticMapTree::unpackTileID(tile, tileX, tileY);
443
444 TileInfo tileInfo;
445 tileInfo.m_mapId = mapID;
446 tileInfo.m_tileX = tileX;
447 tileInfo.m_tileY = tileY;
448 memcpy(&tileInfo.m_navMeshParams, navMesh->getParams(), sizeof(dtNavMeshParams));
449 _queue.Push(tileInfo);
450 }
451
452 dtFreeNavMesh(navMesh);
453 }
454 }
std::uint32_t uint32
Definition Define.h:107
ProducerConsumerQueue< TileInfo > _queue
Definition MapBuilder.h:188
std::set< uint32 > * getTileList(uint32 mapID)
Definition MapBuilder.cpp:190
void buildNavMesh(uint32 mapID, dtNavMesh *&navMesh)
Definition MapBuilder.cpp:510
static void unpackTileID(uint32 ID, uint32 &tileX, uint32 &tileY)
Definition MapTree.h:73

References _queue, buildNavMesh(), getTileList(), MMAP::TileInfo::m_mapId, MMAP::TileInfo::m_navMeshParams, MMAP::TileInfo::m_tileX, MMAP::TileInfo::m_tileY, m_totalTilesProcessed, and VMAP::StaticMapTree::unpackTileID().

Referenced by buildMaps().

◆ buildMaps()

void MMAP::MapBuilder::buildMaps ( Optional< uint32 mapID)
203 {
204 printf("Using %u threads to generate mmaps\n", m_threads);
205
206 for (unsigned int i = 0; i < m_threads; ++i)
207 {
209 }
210
211 if (mapID)
212 {
213 buildMap(*mapID);
214 }
215 else
216 {
217 // Build all maps if no map id has been specified
218 for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
219 {
220 if (!shouldSkipMap(it->m_mapId))
221 buildMap(it->m_mapId);
222 }
223 }
224
225 while (!_queue.Empty())
226 {
227 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
228 }
229
230 _cancelationToken = true;
231
232 _queue.Cancel();
233
234 for (auto& builder : m_tileBuilders)
235 delete builder;
236
237 m_tileBuilders.clear();
238 }
std::vector< TileBuilder * > m_tileBuilders
Definition MapBuilder.h:187
bool shouldSkipMap(uint32 mapID) const
Definition MapBuilder.cpp:933
friend class TileBuilder
Definition MapBuilder.h:124
void buildMap(uint32 mapID)
Definition MapBuilder.cpp:419

References _cancelationToken, _queue, buildMap(), m_debugOutput, m_skipLiquid, m_threads, m_tileBuilders, m_tiles, shouldSkipMap(), and TileBuilder.

Referenced by main().

◆ buildMeshFromFile()

void MMAP::MapBuilder::buildMeshFromFile ( char *  name)
286 {
287 FILE* file = fopen(name, "rb");
288 if (!file)
289 return;
290
291 printf("Building mesh from file\n");
292 int tileX, tileY, mapId;
293 if (fread(&mapId, sizeof(int), 1, file) != 1)
294 {
295 fclose(file);
296 return;
297 }
298 if (fread(&tileX, sizeof(int), 1, file) != 1)
299 {
300 fclose(file);
301 return;
302 }
303 if (fread(&tileY, sizeof(int), 1, file) != 1)
304 {
305 fclose(file);
306 return;
307 }
308
309 dtNavMesh* navMesh = nullptr;
310 buildNavMesh(mapId, navMesh);
311 if (!navMesh)
312 {
313 printf("Failed creating navmesh! \n");
314 fclose(file);
315 return;
316 }
317
318 uint32 verticesCount, indicesCount;
319 if (fread(&verticesCount, sizeof(uint32), 1, file) != 1)
320 {
321 fclose(file);
322 return;
323 }
324
325 if (fread(&indicesCount, sizeof(uint32), 1, file) != 1)
326 {
327 fclose(file);
328 return;
329 }
330
331 float* verts = new float[verticesCount];
332 int* inds = new int[indicesCount];
333
334 if (fread(verts, sizeof(float), verticesCount, file) != verticesCount)
335 {
336 fclose(file);
337 delete[] verts;
338 delete[] inds; // cppcheck-suppress uninitdata
339 return;
340 }
341
342 if (fread(inds, sizeof(int), indicesCount, file) != indicesCount)
343 {
344 fclose(file);
345 delete[] verts;
346 delete[] inds;
347 return;
348 }
349
350 MeshData data;
351
352 for (uint32 i = 0; i < verticesCount; ++i)
353 data.solidVerts.append(verts[i]);
354 delete[] verts;
355
356 for (uint32 i = 0; i < indicesCount; ++i)
357 data.solidTris.append(inds[i]);
358 delete[] inds;
359
360 TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris);
361 // get bounds of current tile
362 float bmin[3], bmax[3];
363 getTileBounds(tileX, tileY, data.solidVerts.getCArray(), data.solidVerts.size() / 3, bmin, bmax);
364
365 // build navmesh tile
367 tileBuilder.buildMoveMapTile(mapId, tileX, tileY, data, bmin, bmax, navMesh);
368 fclose(file);
369 }
void getTileBounds(uint32 tileX, uint32 tileY, float *verts, int vertCount, float *bmin, float *bmax) const
Definition MapBuilder.cpp:914
static void cleanVertices(G3D::Array< float > &verts, G3D::Array< int > &tris)
Definition TerrainBuilder.cpp:894

References MMAP::TileBuilder::buildMoveMapTile(), buildNavMesh(), MMAP::TerrainBuilder::cleanVertices(), getTileBounds(), m_debugOutput, m_skipLiquid, MMAP::MeshData::solidTris, MMAP::MeshData::solidVerts, and TileBuilder.

Referenced by main().

◆ buildNavMesh()

void MMAP::MapBuilder::buildNavMesh ( uint32  mapID,
dtNavMesh *&  navMesh 
)
private

‍*** calculate number of bits needed to store tiles & polys ***‍/

511 {
512 std::set<uint32>* tiles = getTileList(mapID);
513
514 // old code for non-statically assigned bitmask sizes:
516 //int tileBits = dtIlog2(dtNextPow2(tiles->size()));
517 //if (tileBits < 1) tileBits = 1; // need at least one bit!
518 //int polyBits = sizeof(dtPolyRef)*8 - SALT_MIN_BITS - tileBits;
519
520 int polyBits = DT_POLY_BITS;
521
522 int maxTiles = tiles->size();
523 int maxPolysPerTile = 1 << polyBits;
524
525 /*** calculate bounds of map ***/
526
527 uint32 tileXMin = 64, tileYMin = 64, tileXMax = 0, tileYMax = 0, tileX, tileY;
528 for (unsigned int tile : *tiles)
529 {
530 StaticMapTree::unpackTileID(tile, tileX, tileY);
531
532 if (tileX > tileXMax)
533 tileXMax = tileX;
534 else if (tileX < tileXMin)
535 tileXMin = tileX;
536
537 if (tileY > tileYMax)
538 tileYMax = tileY;
539 else if (tileY < tileYMin)
540 tileYMin = tileY;
541 }
542
543 // use Max because '32 - tileX' is negative for values over 32
544 float bmin[3], bmax[3];
545 getTileBounds(tileXMax, tileYMax, nullptr, 0, bmin, bmax);
546
547 /*** now create the navmesh ***/
548
549 // navmesh creation params
550 dtNavMeshParams navMeshParams;
551 memset(&navMeshParams, 0, sizeof(dtNavMeshParams));
552 navMeshParams.tileWidth = GRID_SIZE;
553 navMeshParams.tileHeight = GRID_SIZE;
554 rcVcopy(navMeshParams.orig, bmin);
555 navMeshParams.maxTiles = maxTiles;
556 navMeshParams.maxPolys = maxPolysPerTile;
557
558 navMesh = dtAllocNavMesh();
559 printf("[Map %03i] Creating navMesh...\n", mapID);
560 if (!navMesh->init(&navMeshParams))
561 {
562 printf("[Map %03i] Failed creating navmesh! \n", mapID);
563 return;
564 }
565
566 const std::string fileName = Acore::StringFormat(
569 mapID
570 );
571
572 FILE* file = fopen(fileName.c_str(), "wb");
573 if (!file)
574 {
575 dtFreeNavMesh(navMesh);
576 char message[1024];
577 sprintf(message, "[Map %03i] Failed to open %s for writing!\n", mapID, fileName.c_str());
578 perror(message);
579 return;
580 }
581
582 // now that we know navMesh params are valid, we can write them to file
583 fwrite(&navMeshParams, sizeof(dtNavMeshParams), 1, file);
584 fclose(file);
585 }
std::string DataDirPath() const
Definition Config.h:77
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:34
static const float GRID_SIZE
Definition TerrainBuilder.h:48
static char const *const MAP_FILE_NAME_FORMAT
Definition MMapMgr.h:42

References MMAP::Config::DataDirPath(), getTileBounds(), getTileList(), MMAP::GRID_SIZE, m_config, MMAP::MAP_FILE_NAME_FORMAT, Acore::StringFormat(), and VMAP::StaticMapTree::unpackTileID().

Referenced by buildMap(), buildMeshFromFile(), and buildSingleTile().

◆ buildSingleTile()

void MMAP::MapBuilder::buildSingleTile ( uint32  mapID,
uint32  tileX,
uint32  tileY 
)
Todo:
: delete the old tile as the user clearly wants to rebuild it
373 {
374 dtNavMesh* navMesh = nullptr;
375 buildNavMesh(mapID, navMesh);
376 if (!navMesh)
377 {
378 printf("Failed creating navmesh! \n");
379 return;
380 }
381
383
385 tileBuilder.buildTile(mapID, tileX, tileY, navMesh);
386 dtFreeNavMesh(navMesh);
387
388 _cancelationToken = true;
389
390 _queue.Cancel();
391 }

References _cancelationToken, _queue, buildNavMesh(), MMAP::TileBuilder::buildTile(), m_debugOutput, m_skipLiquid, and TileBuilder.

Referenced by main().

◆ currentPercentageDone()

uint32 MMAP::MapBuilder::currentPercentageDone ( ) const
private
1099 {
1101 }
uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const
Definition MapBuilder.cpp:1090

References m_totalTiles, m_totalTilesProcessed, and percentageDone().

Referenced by MMAP::TileBuilder::buildTile().

◆ discoverTiles()

void MMAP::MapBuilder::discoverTiles ( )
private
98 {
99 std::vector<std::string> files;
100 uint32 mapID, tileX, tileY, tileID, count = 0, fsize = 0;
101 char filter[12];
102
103 printf("Discovering maps... ");
105 for (auto & file : files)
106 {
107 mapID = uint32(atoi(file.substr(0, file.size() - 8).c_str()));
108 if (std::find(m_tiles.begin(), m_tiles.end(), mapID) == m_tiles.end())
109 {
110 m_tiles.emplace_back(mapID, new std::set<uint32>);
111 count++;
112 }
113 }
114
115 files.clear();
116 getDirContents(files, m_config->VMapsPath(), "*.vmtree");
117 for (auto & file : files)
118 {
119 mapID = uint32(atoi(file.substr(0, file.size() - 7).c_str()));
120 if (std::find(m_tiles.begin(), m_tiles.end(), mapID) == m_tiles.end())
121 {
122 m_tiles.emplace_back(mapID, new std::set<uint32>);
123 count++;
124 }
125 }
126 printf("found %u.\n", count);
127
128 count = 0;
129 printf("Discovering tiles... ");
130 for (auto & m_tile : m_tiles)
131 {
132 std::set<uint32>* tiles = m_tile.m_tiles;
133 mapID = m_tile.m_mapId;
134
135 sprintf(filter, "%03u*.vmtile", mapID);
136 files.clear();
137 getDirContents(files, m_config->VMapsPath(), filter);
138 for (auto & file : files)
139 {
140 fsize = file.size();
141
142 tileY = uint32(atoi(file.substr(fsize - 12, 2).c_str()));
143 tileX = uint32(atoi(file.substr(fsize - 9, 2).c_str()));
144 tileID = StaticMapTree::packTileID(tileY, tileX);
145
146 tiles->insert(tileID);
147 count++;
148 }
149
150 sprintf(filter, "%03u*", mapID);
151 files.clear();
152 getDirContents(files, m_config->MapsPath(), filter);
153 for (auto & file : files)
154 {
155 fsize = file.size();
156
157 tileY = uint32(atoi(file.substr(fsize - 8, 2).c_str()));
158 tileX = uint32(atoi(file.substr(fsize - 6, 2).c_str()));
159 tileID = StaticMapTree::packTileID(tileX, tileY);
160
161 if (tiles->insert(tileID).second)
162 count++;
163 }
164
165 // make sure we process maps which don't have tiles
166 if (tiles->empty())
167 {
168 // convert coord bounds to grid bounds
169 uint32 minX, minY, maxX, maxY;
170 getGridBounds(mapID, minX, minY, maxX, maxY);
171
172 // add all tiles within bounds to tile list.
173 for (uint32 i = minX; i <= maxX; ++i)
174 for (uint32 j = minY; j <= maxY; ++j)
175 if (tiles->insert(StaticMapTree::packTileID(i, j)).second)
176 count++;
177 }
178 }
179 printf("found %u.\n\n", count);
180
181 // Calculate tiles to process in total
182 for (auto & m_tile : m_tiles)
183 {
184 if (!shouldSkipMap(m_tile.m_mapId))
185 m_totalTiles += m_tile.m_tiles->size();
186 }
187 }
std::string MapsPath() const
Definition Config.h:75
std::string VMapsPath() const
Definition Config.h:74
void getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY) const
Definition MapBuilder.cpp:241
static uint32 packTileID(uint32 tileX, uint32 tileY)
Definition MapTree.h:72
ListFilesResult getDirContents(std::vector< std::string > &fileList, std::string dirpath=".", std::string filter="*")
Definition PathCommon.h:82

References MMAP::getDirContents(), getGridBounds(), m_config, m_tiles, m_totalTiles, MMAP::Config::MapsPath(), VMAP::StaticMapTree::packTileID(), shouldSkipMap(), and MMAP::Config::VMapsPath().

Referenced by MapBuilder().

◆ getConfig()

const Config & MMAP::MapBuilder::getConfig ( ) const
inline

◆ getGridBounds()

void MMAP::MapBuilder::getGridBounds ( uint32  mapID,
uint32 minX,
uint32 minY,
uint32 maxX,
uint32 maxY 
) const
private
242 {
243 // min and max are initialized to invalid values so the caller iterating the [min, max] range
244 // will never enter the loop unless valid min/max values are found
245 maxX = 0;
246 maxY = 0;
247 minX = std::numeric_limits<uint32>::max();
248 minY = std::numeric_limits<uint32>::max();
249
250 float bmin[3] = { 0, 0, 0 };
251 float bmax[3] = { 0, 0, 0 };
252 float lmin[3] = { 0, 0, 0 };
253 float lmax[3] = { 0, 0, 0 };
254 MeshData meshData;
255
256 // make sure we process maps which don't have tiles
257 // initialize the static tree, which loads WDT models
258 if (!m_terrainBuilder->loadVMap(mapID, 64, 64, meshData))
259 return;
260
261 // get the coord bounds of the model data
262 if (meshData.solidVerts.size() + meshData.liquidVerts.size() == 0)
263 return;
264
265 // get the coord bounds of the model data
266 if (meshData.solidVerts.size() && meshData.liquidVerts.size())
267 {
268 rcCalcBounds(meshData.solidVerts.getCArray(), meshData.solidVerts.size() / 3, bmin, bmax);
269 rcCalcBounds(meshData.liquidVerts.getCArray(), meshData.liquidVerts.size() / 3, lmin, lmax);
270 rcVmin(bmin, lmin);
271 rcVmax(bmax, lmax);
272 }
273 else if (meshData.solidVerts.size())
274 rcCalcBounds(meshData.solidVerts.getCArray(), meshData.solidVerts.size() / 3, bmin, bmax);
275 else
276 rcCalcBounds(meshData.liquidVerts.getCArray(), meshData.liquidVerts.size() / 3, lmin, lmax);
277
278 // convert coord bounds to grid bounds
279 maxX = 32 - bmin[0] / GRID_SIZE;
280 maxY = 32 - bmin[2] / GRID_SIZE;
281 minX = 32 - bmax[0] / GRID_SIZE;
282 minY = 32 - bmax[2] / GRID_SIZE;
283 }
bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
Definition TerrainBuilder.cpp:677

References MMAP::GRID_SIZE, MMAP::MeshData::liquidVerts, MMAP::TerrainBuilder::loadVMap(), m_terrainBuilder, and MMAP::MeshData::solidVerts.

Referenced by discoverTiles().

◆ getRecastConfig()

rcConfig MMAP::MapBuilder::getRecastConfig ( const ResolvedMeshConfig cfg,
float  bmin[3],
float  bmax[3] 
) const
private
1064 {
1065 rcConfig config;
1066 memset(&config, 0, sizeof(rcConfig));
1067
1068 rcVcopy(config.bmin, bmin);
1069 rcVcopy(config.bmax, bmax);
1070
1071 config.maxVertsPerPoly = DT_VERTS_PER_POLYGON;
1072 config.cs = cfg.cellSizeHorizontal;
1073 config.ch = cfg.cellSizeVertical;
1074 config.walkableSlopeAngle = cfg.walkableSlopeAngle;
1075 config.tileSize = cfg.vertexPerTileEdge;
1076 config.walkableRadius = cfg.walkableRadius;
1077 config.borderSize = cfg.walkableRadius + 3;
1078 config.maxEdgeLen = cfg.vertexPerTileEdge + 1; // anything bigger than tileSize
1079 config.walkableHeight = cfg.walkableHeight;
1080 config.walkableClimb = cfg.walkableClimb;
1081 config.minRegionArea = rcSqr(60);
1082 config.mergeRegionArea = rcSqr(50);
1083 config.maxSimplificationError = cfg.maxSimplificationError; // eliminates most jagged edges (tiny polygons)
1084 config.detailSampleDist = config.cs * 16;
1085 config.detailSampleMaxError = config.ch * 1;
1086 return config;
1087 }

References MMAP::ResolvedMeshConfig::cellSizeHorizontal, MMAP::ResolvedMeshConfig::cellSizeVertical, MMAP::ResolvedMeshConfig::maxSimplificationError, MMAP::ResolvedMeshConfig::vertexPerTileEdge, MMAP::ResolvedMeshConfig::walkableClimb, MMAP::ResolvedMeshConfig::walkableHeight, MMAP::ResolvedMeshConfig::walkableRadius, and MMAP::ResolvedMeshConfig::walkableSlopeAngle.

Referenced by MMAP::TileBuilder::buildMoveMapTile().

◆ getTileBounds()

void MMAP::MapBuilder::getTileBounds ( uint32  tileX,
uint32  tileY,
float *  verts,
int  vertCount,
float *  bmin,
float *  bmax 
) const
private
915 {
916 // this is for elevation
917 if (verts && vertCount)
918 rcCalcBounds(verts, vertCount, bmin, bmax);
919 else
920 {
921 bmin[1] = FLT_MIN;
922 bmax[1] = FLT_MAX;
923 }
924
925 // this is for width and depth
926 bmax[0] = (32 - int(tileX)) * GRID_SIZE;
927 bmax[2] = (32 - int(tileY)) * GRID_SIZE;
928 bmin[0] = bmax[0] - GRID_SIZE;
929 bmin[2] = bmax[2] - GRID_SIZE;
930 }

References MMAP::GRID_SIZE.

Referenced by buildMeshFromFile(), buildNavMesh(), and MMAP::TileBuilder::buildTile().

◆ getTileList()

std::set< uint32 > * MMAP::MapBuilder::getTileList ( uint32  mapID)
private
191 {
192 TileList::iterator itr = std::find(m_tiles.begin(), m_tiles.end(), mapID);
193 if (itr != m_tiles.end())
194 return (*itr).m_tiles;
195
196 std::set<uint32>* tiles = new std::set<uint32>();
197 m_tiles.emplace_back(mapID, tiles);
198 return tiles;
199 }

References m_tiles.

Referenced by buildMap(), and buildNavMesh().

◆ isContinentMap()

bool MMAP::MapBuilder::isContinentMap ( uint32  mapID) const
private
1021 {
1022 switch (mapID)
1023 {
1024 case 0:
1025 case 1:
1026 case 530:
1027 case 571:
1028 return true;
1029 default:
1030 return false;
1031 }
1032 }

Referenced by shouldSkipMap().

◆ isTransportMap()

bool MMAP::MapBuilder::isTransportMap ( uint32  mapID) const
private
982 {
983 switch (mapID)
984 {
985 // transport maps
986 case 582:
987 case 584:
988 case 586:
989 case 587:
990 case 588:
991 case 589:
992 case 590:
993 case 591:
994 case 592:
995 case 593:
996 case 594:
997 case 596:
998 case 610:
999 case 612:
1000 case 613:
1001 case 614:
1002 case 620:
1003 case 621:
1004 case 622:
1005 case 623:
1006 case 641:
1007 case 642:
1008 case 647:
1009 case 672:
1010 case 673:
1011 case 712:
1012 case 713:
1013 case 718:
1014 return true;
1015 default:
1016 return false;
1017 }
1018 }

Referenced by shouldSkipMap().

◆ percentageDone()

uint32 MMAP::MapBuilder::percentageDone ( uint32  totalTiles,
uint32  totalTilesDone 
) const
private
1091 {
1092 if (totalTiles)
1093 return totalTilesBuilt * 100 / totalTiles;
1094
1095 return 0;
1096 }

Referenced by currentPercentageDone().

◆ shouldSkipMap()

bool MMAP::MapBuilder::shouldSkipMap ( uint32  mapID) const
private
934 {
935 if (m_mapid >= 0)
936 return static_cast<uint32>(m_mapid) != mapID;
937
939 if (isContinentMap(mapID))
940 return true;
941
942 if (m_skipJunkMaps)
943 switch (mapID)
944 {
945 case 13: // test.wdt
946 case 25: // ScottTest.wdt
947 case 29: // Test.wdt
948 case 42: // Colin.wdt
949 case 169: // EmeraldDream.wdt (unused, and very large)
950 case 451: // development.wdt
951 case 573: // ExteriorTest.wdt
952 case 597: // CraigTest.wdt
953 case 605: // development_nonweighted.wdt
954 case 606: // QA_DVD.wdt
955 return true;
956 default:
957 if (isTransportMap(mapID))
958 return true;
959 break;
960 }
961
963 switch (mapID)
964 {
965 case 30: // AV
966 case 37: // ?
967 case 489: // WSG
968 case 529: // AB
969 case 566: // EotS
970 case 607: // SotA
971 case 628: // IoC
972 return true;
973 default:
974 break;
975 }
976
977 return false;
978 }
bool isTransportMap(uint32 mapID) const
Definition MapBuilder.cpp:981
bool isContinentMap(uint32 mapID) const
Definition MapBuilder.cpp:1020

References isContinentMap(), isTransportMap(), m_mapid, m_skipBattlegrounds, m_skipContinents, and m_skipJunkMaps.

Referenced by buildMaps(), and discoverTiles().

Friends And Related Symbol Documentation

◆ TileBuilder

friend class TileBuilder
friend

Member Data Documentation

◆ _cancelationToken

std::atomic<bool> MMAP::MapBuilder::_cancelationToken
private

◆ _queue

◆ m_config

Config* MMAP::MapBuilder::m_config
private

◆ m_debugOutput

bool MMAP::MapBuilder::m_debugOutput
private

◆ m_mapid

int32 MMAP::MapBuilder::m_mapid
private

Referenced by shouldSkipMap().

◆ m_offMeshFilePath

const char* MMAP::MapBuilder::m_offMeshFilePath
private

◆ m_rcContext

rcContext* MMAP::MapBuilder::m_rcContext {nullptr}
private
185{nullptr};

Referenced by MapBuilder(), and ~MapBuilder().

◆ m_skipBattlegrounds

bool MMAP::MapBuilder::m_skipBattlegrounds
private

Referenced by shouldSkipMap().

◆ m_skipContinents

bool MMAP::MapBuilder::m_skipContinents
private

Referenced by shouldSkipMap().

◆ m_skipJunkMaps

bool MMAP::MapBuilder::m_skipJunkMaps
private

Referenced by shouldSkipMap().

◆ m_skipLiquid

bool MMAP::MapBuilder::m_skipLiquid
private

◆ m_terrainBuilder

TerrainBuilder* MMAP::MapBuilder::m_terrainBuilder {nullptr}
private
165{nullptr};

Referenced by getGridBounds(), MapBuilder(), and ~MapBuilder().

◆ m_threads

unsigned int MMAP::MapBuilder::m_threads
private

Referenced by buildMaps(), and MapBuilder().

◆ m_tileBuilders

std::vector<TileBuilder*> MMAP::MapBuilder::m_tileBuilders
private

Referenced by buildMaps().

◆ m_tiles

TileList MMAP::MapBuilder::m_tiles
private

◆ m_totalTiles

std::atomic<uint32> MMAP::MapBuilder::m_totalTiles
private

◆ m_totalTilesProcessed

std::atomic<uint32> MMAP::MapBuilder::m_totalTilesProcessed
private

The documentation for this class was generated from the following files: