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

#include "Config.h"

Classes

struct  GlobalConfig
 
struct  MapOverride
 
struct  TileOverride
 

Public Member Functions

 ~Config ()=default
 
ResolvedMeshConfig GetConfigForTile (uint32 mapID, uint32 tileX, uint32 tileY) const
 
bool ShouldSkipLiquid () const
 
bool ShouldSkipContinents () const
 
bool ShouldSkipJunkMaps () const
 
bool ShouldSkipBattlegrounds () const
 
bool IsDebugOutputEnabled () const
 
std::string VMapsPath () const
 
std::string MapsPath () const
 
std::string MMapsPath () const
 
std::string DataDirPath () const
 
std::vector< std::string > const & OffMeshConnections () const
 

Static Public Member Functions

static std::optional< ConfigFromFile (std::string_view configFile)
 

Private Member Functions

 Config ()
 
bool LoadConfig (std::string_view configFile)
 

Private Attributes

GlobalConfig _global
 
std::unordered_map< uint32, MapOverride_maps
 
bool _skipLiquid
 
bool _skipContinents
 
bool _skipJunkMaps
 
bool _skipBattlegrounds
 
bool _debugOutput
 
std::filesystem::path _dataDir
 
std::vector< std::string > _offmeshConnections
 

Detailed Description

Constructor & Destructor Documentation

◆ ~Config()

MMAP::Config::~Config ( )
default

◆ Config()

MMAP::Config::Config ( )
explicitprivate
72 {
73 }

Member Function Documentation

◆ DataDirPath()

std::string MMAP::Config::DataDirPath ( ) const
inline

◆ FromFile()

std::optional< Config > MMAP::Config::FromFile ( std::string_view  configFile)
static
63 {
64 Config config;
65 if (!config.LoadConfig(configFile))
66 return std::nullopt;
67
68 return config;
69 }
Config()
Definition Config.cpp:71

References LoadConfig().

Referenced by main().

◆ GetConfigForTile()

ResolvedMeshConfig MMAP::Config::GetConfigForTile ( uint32  mapID,
uint32  tileX,
uint32  tileY 
) const
76 {
77 MapOverride const* mapOverride = nullptr;
78 TileOverride const* tileOverride = nullptr;
79
80 // Lookup map and tile overrides
81 if (auto mapIt = _maps.find(mapID); mapIt != _maps.end())
82 {
83 mapOverride = &mapIt->second;
84
85 auto tileIt = mapOverride->tileOverrides.find(MakeTileKey(tileY, tileX));
86 if (tileIt != mapOverride->tileOverrides.end())
87 tileOverride = &tileIt->second;
88 }
89
90 // Helper lambdas to resolve values in order: tile -> map -> global
91 auto resolveFloat = [&](auto TileField, auto MapField, float GlobalValue) -> float {
92 if (tileOverride && TileField(tileOverride)) return *TileField(tileOverride);
93 if (mapOverride && MapField(mapOverride)) return *MapField(mapOverride);
94 return GlobalValue;
95 };
96
97 auto resolveInt = [&](auto TileField, auto MapField, int GlobalValue) -> int {
98 if (tileOverride && TileField(tileOverride)) return *TileField(tileOverride);
99 if (mapOverride && MapField(mapOverride)) return *MapField(mapOverride);
100 return GlobalValue;
101 };
102
103 // Resolve vertex settings
104 int vertexPerMap = resolveInt(
105 [](TileOverride const*) { return std::optional<int>{}; },
106 [](MapOverride const* m) { return m->vertexPerMapEdge; },
108 );
109
110 int vertexPerTile = resolveInt(
111 [](TileOverride const*) { return std::optional<int>{}; },
112 [](MapOverride const* m) { return m->vertexPerTileEdge; },
114 );
115
116 ResolvedMeshConfig config;
117 config.walkableSlopeAngle = resolveFloat(
118 [](TileOverride const* t) { return t->walkableSlopeAngle; },
119 [](MapOverride const* m) { return m->walkableSlopeAngle; },
121 );
122
123 config.walkableRadius = resolveInt(
124 [](TileOverride const* t) { return t->walkableRadius; },
125 [](MapOverride const* m) { return m->walkableRadius; },
127 );
128
129 config.walkableHeight = resolveInt(
130 [](TileOverride const* t) { return t->walkableHeight; },
131 [](MapOverride const* m) { return m->walkableHeight; },
133 );
134
135 config.walkableClimb = resolveInt(
136 [](TileOverride const* t) { return t->walkableClimb; },
137 [](MapOverride const* m) { return m->walkableClimb; },
139 );
140
141 config.vertexPerMapEdge = vertexPerMap;
142 config.vertexPerTileEdge = vertexPerTile;
143 config.baseUnitDim = ComputeBaseUnitDim(vertexPerMap);
144 config.tilesPerMapEdge = vertexPerMap / vertexPerTile;
145 config.maxSimplificationError = _global.maxSimplificationError;
146 config.cellSizeHorizontal = config.baseUnitDim;
147 config.cellSizeVertical = config.baseUnitDim;
148
149 if (mapOverride && mapOverride->cellSizeHorizontal.has_value())
150 config.cellSizeHorizontal = *mapOverride->cellSizeHorizontal;
151
152 if (mapOverride && mapOverride->cellSizeVertical.has_value())
153 config.cellSizeVertical = *mapOverride->cellSizeVertical;
154
155 return config;
156 }
GlobalConfig _global
Definition Config.h:148
std::unordered_map< uint32, MapOverride > _maps
Definition Config.h:149
std::pair< uint32, uint32 > MakeTileKey(uint32 x, uint32 y)
Definition Config.cpp:31
float ComputeBaseUnitDim(int vertexPerMapEdge)
Definition Config.cpp:26
float maxSimplificationError
Definition Config.h:145
int walkableHeight
Definition Config.h:127
int walkableRadius
Definition Config.h:123
int vertexPerTileEdge
Definition Config.h:141
float walkableSlopeAngle
Definition Config.h:119
int walkableClimb
Definition Config.h:131
int vertexPerMapEdge
Definition Config.h:135

References _global, _maps, MMAP::Config::MapOverride::cellSizeHorizontal, MMAP::Config::MapOverride::cellSizeVertical, MMAP::ComputeBaseUnitDim(), MMAP::MakeTileKey(), MMAP::Config::GlobalConfig::maxSimplificationError, MMAP::Config::MapOverride::tileOverrides, MMAP::Config::GlobalConfig::vertexPerMapEdge, MMAP::Config::GlobalConfig::vertexPerTileEdge, MMAP::Config::TileOverride::walkableClimb, MMAP::Config::GlobalConfig::walkableClimb, MMAP::Config::TileOverride::walkableHeight, MMAP::Config::GlobalConfig::walkableHeight, MMAP::Config::TileOverride::walkableRadius, MMAP::Config::GlobalConfig::walkableRadius, MMAP::ResolvedMeshConfig::walkableSlopeAngle, MMAP::Config::TileOverride::walkableSlopeAngle, and MMAP::Config::GlobalConfig::walkableSlopeAngle.

Referenced by MMAP::TileBuilder::buildMoveMapTile(), and MMAP::TileBuilder::shouldSkipTile().

◆ IsDebugOutputEnabled()

bool MMAP::Config::IsDebugOutputEnabled ( ) const
inline
72{ return _debugOutput; }
bool _debugOutput
Definition Config.h:155

References _debugOutput.

◆ LoadConfig()

bool MMAP::Config::LoadConfig ( std::string_view  configFile)
private
158 {
159 FILE* f = std::fopen(configFile.data(), "r");
160 if (!f)
161 return false;
162
163 fkyaml::node root = fkyaml::node::deserialize(f);
164 std::fclose(f);
165
166 if (!root.contains("mmapsConfig"))
167 return false;
168
169 fkyaml::node mmapsNode = root["mmapsConfig"];
170
171 auto tryFloat = [](fkyaml::node const& n, char const* key, float& out)
172 {
173 if (n.contains(key)) out = n[key].get_value<float>();
174 };
175 auto tryInt = [](fkyaml::node const& n, char const* key, int& out)
176 {
177 if (n.contains(key)) out = n[key].get_value<int>();
178 };
179 auto tryBoolean = [](fkyaml::node const& n, char const* key, bool& out)
180 {
181 if (n.contains(key)) out = n[key].get_value<bool>();
182 };
183 auto tryString = [](fkyaml::node const& n, char const* key, std::string& out)
184 {
185 if (n.contains(key)) out = n[key].get_value<std::string>();
186 };
187
188 tryBoolean(mmapsNode, "skipLiquid", _skipLiquid);
189 tryBoolean(mmapsNode, "skipContinents", _skipContinents);
190 tryBoolean(mmapsNode, "skipJunkMaps", _skipJunkMaps);
191 tryBoolean(mmapsNode, "skipBattlegrounds", _skipBattlegrounds);
192 tryBoolean(mmapsNode, "debugOutput", _debugOutput);
193
194 if (mmapsNode.contains("offmeshConnections") && mmapsNode["offmeshConnections"].is_sequence())
195 {
196 _offmeshConnections = mmapsNode["offmeshConnections"].get_value<std::vector<std::string>>();
197 }
198 else
199 {
200 _offmeshConnections.clear();
201 }
202
203 std::string dataDirPath;
204 tryString(mmapsNode, "dataDir", dataDirPath);
205 _dataDir = dataDirPath;
206
207 mmapsNode = mmapsNode["meshSettings"];
208
209 // Global config
210 tryFloat(mmapsNode, "walkableSlopeAngle", _global.walkableSlopeAngle);
211 tryInt(mmapsNode, "walkableHeight", _global.walkableHeight);
212 tryInt(mmapsNode, "walkableClimb", _global.walkableClimb);
213 tryInt(mmapsNode, "walkableRadius", _global.walkableRadius);
214 tryInt(mmapsNode, "verticesPerMapEdge", _global.vertexPerMapEdge);
215 tryInt(mmapsNode, "verticesPerTileEdge", _global.vertexPerTileEdge);
216 tryFloat(mmapsNode, "maxSimplificationError", _global.maxSimplificationError);
217
218 // Map overrides
219 if (mmapsNode.contains("mapsOverrides"))
220 {
221 fkyaml::node maps = mmapsNode["mapsOverrides"];
222 for (auto const& mapEntry : maps.as_map())
223 {
224 uint32 mapId = std::stoi(mapEntry.first.as_str());
225
226 MapOverride override;
227 fkyaml::node mapNode = mapEntry.second;
228
229 if (mapNode.contains("walkableSlopeAngle"))
230 override.walkableSlopeAngle = mapNode["walkableSlopeAngle"].get_value<float>();
231 if (mapNode.contains("walkableRadius"))
232 override.walkableRadius = mapNode["walkableRadius"].get_value<int>();
233 if (mapNode.contains("walkableHeight"))
234 override.walkableHeight = mapNode["walkableHeight"].get_value<int>();
235 if (mapNode.contains("walkableClimb"))
236 override.walkableClimb = mapNode["walkableClimb"].get_value<int>();
237 if (mapNode.contains("verticesPerMapEdge"))
238 override.vertexPerMapEdge = mapNode["verticesPerMapEdge"].get_value<int>();
239 if (mapNode.contains("verticesPerTileEdge"))
240 override.vertexPerTileEdge = mapNode["verticesPerTileEdge"].get_value<int>();
241 if (mapNode.contains("cellSizeHorizontal"))
242 override.cellSizeHorizontal = mapNode["cellSizeHorizontal"].get_value<float>();
243 if (mapNode.contains("cellSizeVertical"))
244 override.cellSizeVertical = mapNode["cellSizeVertical"].get_value<float>();
245
246 // Tile overrides
247 if (mapNode.contains("tilesOverrides"))
248 {
249 fkyaml::node tiles = mapNode["tilesOverrides"];
250 for (auto const& tileEntry : tiles.as_map())
251 {
252 std::string key = tileEntry.first.as_str();
253 fkyaml::node tileNode = tileEntry.second;
254
255 size_t comma = key.find(',');
256 if (comma == std::string::npos)
257 continue;
258
259 uint32 tileX = static_cast<uint32>(std::stoi(key.substr(0, comma)));
260 uint32 tileY = static_cast<uint32>(std::stoi(key.substr(comma + 1)));
261
262 TileOverride tileOverride;
263 if (tileNode.contains("walkableSlopeAngle"))
264 tileOverride.walkableSlopeAngle = tileNode["walkableSlopeAngle"].get_value<float>();
265 if (tileNode.contains("walkableRadius"))
266 tileOverride.walkableRadius = tileNode["walkableRadius"].get_value<int>();
267 if (tileNode.contains("walkableHeight"))
268 tileOverride.walkableHeight = tileNode["walkableHeight"].get_value<int>();
269 if (tileNode.contains("walkableClimb"))
270 tileOverride.walkableClimb = tileNode["walkableClimb"].get_value<int>();
271
272 override.tileOverrides[{tileX, tileY}] = std::move(tileOverride);
273 }
274 }
275
276 _maps[mapId] = std::move(override);
277 }
278 }
279
280 // Resolve data dir path. Maybe we need to use an executable path instead of the current dir.
281 if (isCurrentDirectory(_dataDir.string()) && !std::filesystem::exists(MapsPath()))
282 if (auto execPath = std::filesystem::path(executableDirectoryPath()); std::filesystem::exists(execPath/ "maps"))
283 _dataDir = execPath;
284
285 return true;
286 }
std::uint32_t uint32
Definition Define.h:107
std::string MapsPath() const
Definition Config.h:75
bool _skipContinents
Definition Config.h:152
bool _skipBattlegrounds
Definition Config.h:154
std::vector< std::string > _offmeshConnections
Definition Config.h:159
bool _skipJunkMaps
Definition Config.h:153
bool _skipLiquid
Definition Config.h:151
std::string executableDirectoryPath()
Definition PathCommon.h:39
bool isCurrentDirectory(std::string const &pathStr)
Definition Config.cpp:36

References _dataDir, _debugOutput, _global, _maps, _offmeshConnections, _skipBattlegrounds, _skipContinents, _skipJunkMaps, _skipLiquid, MMAP::executableDirectoryPath(), MMAP::isCurrentDirectory(), MapsPath(), MMAP::Config::GlobalConfig::maxSimplificationError, MMAP::Config::GlobalConfig::vertexPerMapEdge, MMAP::Config::GlobalConfig::vertexPerTileEdge, MMAP::Config::TileOverride::walkableClimb, MMAP::Config::GlobalConfig::walkableClimb, MMAP::Config::TileOverride::walkableHeight, MMAP::Config::GlobalConfig::walkableHeight, MMAP::Config::TileOverride::walkableRadius, MMAP::Config::GlobalConfig::walkableRadius, MMAP::Config::TileOverride::walkableSlopeAngle, MMAP::Config::MapOverride::walkableSlopeAngle, and MMAP::Config::GlobalConfig::walkableSlopeAngle.

Referenced by FromFile().

◆ MapsPath()

std::string MMAP::Config::MapsPath ( ) const
inline
75{ return (_dataDir / "maps").string(); }

References _dataDir.

Referenced by MMAP::MapBuilder::discoverTiles(), and LoadConfig().

◆ MMapsPath()

std::string MMAP::Config::MMapsPath ( ) const
inline
76{ return (_dataDir / "mmaps").string(); }

References _dataDir.

◆ OffMeshConnections()

std::vector< std::string > const & MMAP::Config::OffMeshConnections ( ) const
inline

◆ ShouldSkipBattlegrounds()

bool MMAP::Config::ShouldSkipBattlegrounds ( ) const
inline
71{ return _skipBattlegrounds; }

References _skipBattlegrounds.

◆ ShouldSkipContinents()

bool MMAP::Config::ShouldSkipContinents ( ) const
inline
69{ return _skipContinents; }

References _skipContinents.

◆ ShouldSkipJunkMaps()

bool MMAP::Config::ShouldSkipJunkMaps ( ) const
inline
70{ return _skipJunkMaps; }

References _skipJunkMaps.

◆ ShouldSkipLiquid()

bool MMAP::Config::ShouldSkipLiquid ( ) const
inline
68{ return _skipLiquid; }

References _skipLiquid.

Referenced by MMAP::MapBuilder::MapBuilder().

◆ VMapsPath()

std::string MMAP::Config::VMapsPath ( ) const
inline
74{ return (_dataDir / "vmaps").string(); }

References _dataDir.

Referenced by MMAP::MapBuilder::discoverTiles().

Member Data Documentation

◆ _dataDir

std::filesystem::path MMAP::Config::_dataDir
private

◆ _debugOutput

bool MMAP::Config::_debugOutput
private

Referenced by IsDebugOutputEnabled(), and LoadConfig().

◆ _global

GlobalConfig MMAP::Config::_global
private

Referenced by GetConfigForTile(), and LoadConfig().

◆ _maps

std::unordered_map<uint32, MapOverride> MMAP::Config::_maps
private

Referenced by GetConfigForTile(), and LoadConfig().

◆ _offmeshConnections

std::vector<std::string> MMAP::Config::_offmeshConnections
private

Referenced by LoadConfig(), and OffMeshConnections().

◆ _skipBattlegrounds

bool MMAP::Config::_skipBattlegrounds
private

◆ _skipContinents

bool MMAP::Config::_skipContinents
private

Referenced by LoadConfig(), and ShouldSkipContinents().

◆ _skipJunkMaps

bool MMAP::Config::_skipJunkMaps
private

Referenced by LoadConfig(), and ShouldSkipJunkMaps().

◆ _skipLiquid

bool MMAP::Config::_skipLiquid
private

Referenced by LoadConfig(), and ShouldSkipLiquid().


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