TrinityCore
MapBuilder.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef _MAP_BUILDER_H
19#define _MAP_BUILDER_H
20
21#include <vector>
22#include <set>
23#include <list>
24#include <atomic>
25#include <thread>
26
27#include "TerrainBuilder.h"
28
29#include "Recast.h"
30#include "DetourNavMesh.h"
31#include "Optional.h"
33
34using namespace VMAP;
35
36namespace MMAP
37{
38 struct MapTiles
39 {
40 MapTiles() : m_mapId(uint32(-1)), m_tiles(nullptr) {}
41
42 MapTiles(uint32 id, std::set<uint32>* tiles) : m_mapId(id), m_tiles(tiles) {}
44
46 std::set<uint32>* m_tiles;
47
49 {
50 return m_mapId == id;
51 }
52 };
53
54 typedef std::list<MapTiles> TileList;
55
56 struct Tile
57 {
58 Tile() : chf(nullptr), solid(nullptr), cset(nullptr), pmesh(nullptr), dmesh(nullptr) {}
60 {
61 rcFreeCompactHeightfield(chf);
62 rcFreeContourSet(cset);
63 rcFreeHeightField(solid);
64 rcFreePolyMesh(pmesh);
65 rcFreePolyMeshDetail(dmesh);
66 }
67 rcCompactHeightfield* chf;
68 rcHeightfield* solid;
69 rcContourSet* cset;
70 rcPolyMesh* pmesh;
71 rcPolyMeshDetail* dmesh;
72 };
73
75 {
76 TileConfig(bool bigBaseUnit)
77 {
78 // these are WORLD UNIT based metrics
79 // this are basic unit dimentions
80 // value have to divide GRID_SIZE(533.3333f) ( aka: 0.5333, 0.2666, 0.3333, 0.1333, etc )
81 BASE_UNIT_DIM = bigBaseUnit ? 0.5333333f : 0.2666666f;
82
83 // All are in UNIT metrics!
85 VERTEX_PER_TILE = bigBaseUnit ? 40 : 80; // must divide VERTEX_PER_MAP
87 }
88
93 };
94
95 struct TileInfo
96 {
98
102 dtNavMeshParams m_navMeshParams;
103 };
104
105 // ToDo: move this to its own file. For now it will stay here to keep the changes to a minimum, especially in the cpp file
106 class MapBuilder;
108 {
109 public:
110 TileBuilder(MapBuilder* mapBuilder,
111 bool skipLiquid,
112 bool bigBaseUnit,
113 bool debugOutput);
114
116 ~TileBuilder();
117
118 void WorkerThread();
119 void WaitCompletion();
120
121 void buildTile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh);
122 // move map building
123 void buildMoveMapTile(uint32 mapID,
124 uint32 tileX,
125 uint32 tileY,
126 MeshData& meshData,
127 float bmin[3],
128 float bmax[3],
129 dtNavMesh* navMesh);
130
131 bool shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY) const;
132
133 private:
136
139 std::thread m_workerThread;
140 // build performance - not really used for now
141 rcContext* m_rcContext;
142 };
143
145 {
146 friend class TileBuilder;
147
148 public:
149 MapBuilder(Optional<float> maxWalkableAngle,
150 Optional<float> maxWalkableAngleNotSteep,
151 bool skipLiquid,
152 bool skipContinents,
153 bool skipJunkMaps,
154 bool skipBattlegrounds,
155 bool debugOutput,
156 bool bigBaseUnit,
157 int mapid,
158 char const* offMeshFilePath,
159 unsigned int threads);
160
161 ~MapBuilder();
162
163 void buildMeshFromFile(char* name);
164
165 // builds an mmap tile for the specified map and its mesh
166 void buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY);
167
168 // builds list of maps, then builds all of mmap tiles (based on the skip settings)
169 void buildMaps(Optional<uint32> mapID);
170
171 private:
172 // builds all mmap tiles for the specified map id (ignores skip settings)
173 void buildMap(uint32 mapID);
174 // detect maps and tiles
175 void discoverTiles();
176 std::set<uint32>* getTileList(uint32 mapID);
177
178 void buildNavMesh(uint32 mapID, dtNavMesh* &navMesh);
179
180 void getTileBounds(uint32 tileX, uint32 tileY,
181 float* verts, int vertCount,
182 float* bmin, float* bmax) const;
183 void getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY);
184
185 bool shouldSkipMap(uint32 mapID) const;
186 bool isTransportMap(uint32 mapID) const;
187 bool isDevMap(uint32 mapID) const;
188 bool isBattlegroundMap(uint32 mapID) const;
189 bool isContinentMap(uint32 mapID) const;
190
191 rcConfig GetMapSpecificConfig(uint32 mapID, float bmin[3], float bmax[3], const TileConfig &tileConfig) const;
192
193 uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const;
195
196 void ParseOffMeshConnectionsFile(char const* offMeshFilePath);
197
200
202
203 std::vector<OffMeshData> m_offMeshConnections;
204 unsigned int m_threads;
209
213
215
216 std::atomic<uint32> m_totalTiles;
217 std::atomic<uint32> m_totalTilesProcessed;
218
219 // build performance - not really used for now
220 rcContext* m_rcContext;
221
222 std::vector<TileBuilder*> m_tileBuilders;
224 std::atomic<bool> _cancelationToken;
225 };
226}
227
228#endif
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
std::vector< OffMeshData > m_offMeshConnections
Definition: MapBuilder.h:203
void ParseOffMeshConnectionsFile(char const *offMeshFilePath)
Definition: MapBuilder.cpp:199
void buildMaps(Optional< uint32 > mapID)
Definition: MapBuilder.cpp:272
ProducerConsumerQueue< TileInfo > _queue
Definition: MapBuilder.h:223
std::vector< TileBuilder * > m_tileBuilders
Definition: MapBuilder.h:222
void buildMeshFromFile(char *name)
Definition: MapBuilder.cpp:353
std::set< uint32 > * getTileList(uint32 mapID)
Definition: MapBuilder.cpp:234
uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const
bool isDevMap(uint32 mapID) const
Optional< float > m_maxWalkableAngleNotSteep
Definition: MapBuilder.h:211
uint32 currentPercentageDone() const
void buildNavMesh(uint32 mapID, dtNavMesh *&navMesh)
Definition: MapBuilder.cpp:553
bool shouldSkipMap(uint32 mapID) const
Definition: MapBuilder.cpp:995
std::atomic< uint32 > m_totalTiles
Definition: MapBuilder.h:216
rcConfig GetMapSpecificConfig(uint32 mapID, float bmin[3], float bmax[3], const TileConfig &tileConfig) const
rcContext * m_rcContext
Definition: MapBuilder.h:220
bool isTransportMap(uint32 mapID) const
Optional< float > m_maxWalkableAngle
Definition: MapBuilder.h:210
std::atomic< bool > _cancelationToken
Definition: MapBuilder.h:224
bool m_skipBattlegrounds
Definition: MapBuilder.h:207
bool isContinentMap(uint32 mapID) const
void getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY)
Definition: MapBuilder.cpp:311
void buildMap(uint32 mapID)
Definition: MapBuilder.cpp:462
MapBuilder(Optional< float > maxWalkableAngle, Optional< float > maxWalkableAngleNotSteep, bool skipLiquid, bool skipContinents, bool skipJunkMaps, bool skipBattlegrounds, bool debugOutput, bool bigBaseUnit, int mapid, char const *offMeshFilePath, unsigned int threads)
Definition: MapBuilder.cpp:59
TileList m_tiles
Definition: MapBuilder.h:199
void getTileBounds(uint32 tileX, uint32 tileY, float *verts, int vertCount, float *bmin, float *bmax) const
Definition: MapBuilder.cpp:976
std::atomic< uint32 > m_totalTilesProcessed
Definition: MapBuilder.h:217
bool isBattlegroundMap(uint32 mapID) const
void buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY)
Definition: MapBuilder.cpp:440
TerrainBuilder * m_terrainBuilder
Definition: MapBuilder.h:198
unsigned int m_threads
Definition: MapBuilder.h:204
rcContext * m_rcContext
Definition: MapBuilder.h:141
std::thread m_workerThread
Definition: MapBuilder.h:139
bool shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY) const
MapBuilder * m_mapBuilder
Definition: MapBuilder.h:137
void buildTile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh *navMesh)
Definition: MapBuilder.cpp:500
TileBuilder(TileBuilder &&)=default
TileBuilder(MapBuilder *mapBuilder, bool skipLiquid, bool bigBaseUnit, bool debugOutput)
Definition: MapBuilder.cpp:33
void buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, float bmin[3], float bmax[3], dtNavMesh *navMesh)
Definition: MapBuilder.cpp:635
TerrainBuilder * m_terrainBuilder
Definition: MapBuilder.h:138
static const float GRID_SIZE
std::list< MapTiles > TileList
Definition: MapBuilder.h:54
uint32 m_mapId
Definition: MapBuilder.h:45
MapTiles(uint32 id, std::set< uint32 > *tiles)
Definition: MapBuilder.h:42
bool operator==(uint32 id)
Definition: MapBuilder.h:48
std::set< uint32 > * m_tiles
Definition: MapBuilder.h:46
float BASE_UNIT_DIM
Definition: MapBuilder.h:89
TileConfig(bool bigBaseUnit)
Definition: MapBuilder.h:76
uint32 m_mapId
Definition: MapBuilder.h:99
uint32 m_tileX
Definition: MapBuilder.h:100
dtNavMeshParams m_navMeshParams
Definition: MapBuilder.h:102
uint32 m_tileY
Definition: MapBuilder.h:101
rcPolyMesh * pmesh
Definition: MapBuilder.h:70
rcPolyMeshDetail * dmesh
Definition: MapBuilder.h:71
rcHeightfield * solid
Definition: MapBuilder.h:68
rcContourSet * cset
Definition: MapBuilder.h:69
rcCompactHeightfield * chf
Definition: MapBuilder.h:67