TrinityCore
Loading...
Searching...
No Matches
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 "TerrainBuilder.h"
22
23#include "Recast.h"
24#include "DetourNavMesh.h"
25#include "Optional.h"
27
28#include <vector>
29#include <set>
30#include <list>
31#include <atomic>
32#include <thread>
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
48 bool operator==(uint32 id) const
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
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) const;
184
185 bool shouldSkipMap(uint32 mapID) const;
186 bool isTransportMap(uint32 mapID) const;
187 bool isContinentMap(uint32 mapID) const;
188
189 rcConfig GetMapSpecificConfig(uint32 mapID, float bmin[3], float bmax[3], const TileConfig &tileConfig) const;
190
191 uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const;
193
196
198
199 char const* m_offMeshFilePath;
200 unsigned int m_threads;
205
209
211
212 std::atomic<uint32> m_totalTiles;
213 std::atomic<uint32> m_totalTilesProcessed;
214
215 // build performance - not really used for now
216 rcContext* m_rcContext;
217
218 std::vector<TileBuilder*> m_tileBuilders;
220 std::atomic<bool> _cancelationToken;
221 };
222}
223
224#endif
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
void buildMaps(Optional< uint32 > mapID)
char const * m_offMeshFilePath
Definition MapBuilder.h:199
ProducerConsumerQueue< TileInfo > _queue
Definition MapBuilder.h:219
std::vector< TileBuilder * > m_tileBuilders
Definition MapBuilder.h:218
void buildMeshFromFile(char *name)
std::set< uint32 > * getTileList(uint32 mapID)
uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const
Optional< float > m_maxWalkableAngleNotSteep
Definition MapBuilder.h:207
uint32 currentPercentageDone() const
void buildNavMesh(uint32 mapID, dtNavMesh *&navMesh)
bool shouldSkipMap(uint32 mapID) const
std::atomic< uint32 > m_totalTiles
Definition MapBuilder.h:212
rcConfig GetMapSpecificConfig(uint32 mapID, float bmin[3], float bmax[3], const TileConfig &tileConfig) const
rcContext * m_rcContext
Definition MapBuilder.h:216
bool isTransportMap(uint32 mapID) const
Optional< float > m_maxWalkableAngle
Definition MapBuilder.h:206
std::atomic< bool > _cancelationToken
Definition MapBuilder.h:220
bool isContinentMap(uint32 mapID) const
void getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY) const
void buildMap(uint32 mapID)
void getTileBounds(uint32 tileX, uint32 tileY, float *verts, int vertCount, float *bmin, float *bmax) const
std::atomic< uint32 > m_totalTilesProcessed
Definition MapBuilder.h:213
void buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY)
TerrainBuilder * m_terrainBuilder
Definition MapBuilder.h:194
unsigned int m_threads
Definition MapBuilder.h:200
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)
TileBuilder(TileBuilder &&)=default
void buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, float bmin[3], float bmax[3], dtNavMesh *navMesh)
TerrainBuilder * m_terrainBuilder
Definition MapBuilder.h:138
static const float GRID_SIZE
std::list< MapTiles > TileList
Definition MapBuilder.h:54
bool operator==(uint32 id) const
Definition MapBuilder.h:48
MapTiles(uint32 id, std::set< uint32 > *tiles)
Definition MapBuilder.h:42
std::set< uint32 > * m_tiles
Definition MapBuilder.h:46
TileConfig(bool bigBaseUnit)
Definition MapBuilder.h:76
dtNavMeshParams m_navMeshParams
Definition MapBuilder.h:102
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