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
 

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
 

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 const MapOverride* mapOverride = nullptr;
78 const TileOverride* 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 [](const TileOverride*) { return std::optional<int>{}; },
106 [](const MapOverride* m) { return m->vertexPerMapEdge; },
108 );
109
110 int vertexPerTile = resolveInt(
111 [](const TileOverride*) { return std::optional<int>{}; },
112 [](const MapOverride* m) { return m->vertexPerTileEdge; },
114 );
115
116 ResolvedMeshConfig config;
117 config.walkableSlopeAngle = resolveFloat(
118 [](const TileOverride* t) { return t->walkableSlopeAngle; },
119 [](const MapOverride* m) { return m->walkableSlopeAngle; },
121 );
122
123 config.walkableRadius = resolveInt(
124 [](const TileOverride* t) { return t->walkableRadius; },
125 [](const MapOverride* m) { return m->walkableRadius; },
127 );
128
129 config.walkableHeight = resolveInt(
130 [](const TileOverride* t) { return t->walkableHeight; },
131 [](const MapOverride* m) { return m->walkableHeight; },
133 );
134
135 config.walkableClimb = resolveInt(
136 [](const TileOverride* t) { return t->walkableClimb; },
137 [](const MapOverride* 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:146
std::unordered_map< uint32, MapOverride > _maps
Definition Config.h:147
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:143
int walkableHeight
Definition Config.h:125
int walkableRadius
Definition Config.h:121
int vertexPerTileEdge
Definition Config.h:139
float walkableSlopeAngle
Definition Config.h:117
int walkableClimb
Definition Config.h:129
int vertexPerMapEdge
Definition Config.h:133

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:153

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 = [](const fkyaml::node& n, const char* key, float& out)
172 {
173 if (n.contains(key)) out = n[key].get_value<float>();
174 };
175 auto tryInt = [](const fkyaml::node& n, const char* key, int& out)
176 {
177 if (n.contains(key)) out = n[key].get_value<int>();
178 };
179 auto tryBoolean = [](const fkyaml::node& n, const char* key, bool& out)
180 {
181 if (n.contains(key)) out = n[key].get_value<bool>();
182 };
183 auto tryString = [](const fkyaml::node& n, const char* 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 std::string dataDirPath;
195 tryString(mmapsNode, "dataDir", dataDirPath);
196 _dataDir = dataDirPath;
197
198 mmapsNode = mmapsNode["meshSettings"];
199
200 // Global config
201 tryFloat(mmapsNode, "walkableSlopeAngle", _global.walkableSlopeAngle);
202 tryInt(mmapsNode, "walkableHeight", _global.walkableHeight);
203 tryInt(mmapsNode, "walkableClimb", _global.walkableClimb);
204 tryInt(mmapsNode, "walkableRadius", _global.walkableRadius);
205 tryInt(mmapsNode, "vertexPerMapEdge", _global.vertexPerMapEdge);
206 tryInt(mmapsNode, "vertexPerTileEdge", _global.vertexPerTileEdge);
207 tryFloat(mmapsNode, "maxSimplificationError", _global.maxSimplificationError);
208
209 // Map overrides
210 if (mmapsNode.contains("mapsOverrides"))
211 {
212 fkyaml::node maps = mmapsNode["mapsOverrides"];
213 for (auto const& mapEntry : maps.as_map())
214 {
215 uint32 mapId = std::stoi(mapEntry.first.as_str());
216
217 MapOverride override;
218 fkyaml::node mapNode = mapEntry.second;
219
220 if (mapNode.contains("walkableSlopeAngle"))
221 override.walkableSlopeAngle = mapNode["walkableSlopeAngle"].get_value<float>();
222 if (mapNode.contains("walkableRadius"))
223 override.walkableRadius = mapNode["walkableRadius"].get_value<int>();
224 if (mapNode.contains("walkableHeight"))
225 override.walkableHeight = mapNode["walkableHeight"].get_value<int>();
226 if (mapNode.contains("walkableClimb"))
227 override.walkableClimb = mapNode["walkableClimb"].get_value<int>();
228 if (mapNode.contains("vertexPerMapEdge"))
229 override.vertexPerMapEdge = mapNode["vertexPerMapEdge"].get_value<int>();
230 if (mapNode.contains("cellSizeHorizontal"))
231 override.cellSizeHorizontal = mapNode["cellSizeHorizontal"].get_value<float>();
232 if (mapNode.contains("cellSizeVertical"))
233 override.cellSizeVertical = mapNode["cellSizeVertical"].get_value<float>();
234
235 // Tile overrides
236 if (mapNode.contains("tilesOverrides"))
237 {
238 fkyaml::node tiles = mapNode["tilesOverrides"];
239 for (auto const& tileEntry : tiles.as_map())
240 {
241 std::string key = tileEntry.first.as_str();
242 fkyaml::node tileNode = tileEntry.second;
243
244 size_t comma = key.find(',');
245 if (comma == std::string::npos)
246 continue;
247
248 uint32 tileX = static_cast<uint32>(std::stoi(key.substr(0, comma)));
249 uint32 tileY = static_cast<uint32>(std::stoi(key.substr(comma + 1)));
250
251 TileOverride tileOverride;
252 if (tileNode.contains("walkableSlopeAngle"))
253 tileOverride.walkableSlopeAngle = tileNode["walkableSlopeAngle"].get_value<float>();
254 if (tileNode.contains("walkableRadius"))
255 tileOverride.walkableRadius = tileNode["walkableRadius"].get_value<int>();
256 if (tileNode.contains("walkableHeight"))
257 tileOverride.walkableHeight = tileNode["walkableHeight"].get_value<int>();
258 if (tileNode.contains("walkableClimb"))
259 tileOverride.walkableClimb = tileNode["walkableClimb"].get_value<int>();
260
261 override.tileOverrides[{tileX, tileY}] = std::move(tileOverride);
262 }
263 }
264
265 _maps[mapId] = std::move(override);
266 }
267 }
268
269 // Resolve data dir path. Maybe we need to use an executable path instead of the current dir.
270 if (isCurrentDirectory(_dataDir.string()) && !std::filesystem::exists(MapsPath()))
271 if (auto execPath = std::filesystem::path(executableDirectoryPath()); std::filesystem::exists(execPath/ "maps"))
272 _dataDir = execPath;
273
274 return true;
275 }
std::uint32_t uint32
Definition Define.h:107
std::string MapsPath() const
Definition Config.h:75
bool _skipContinents
Definition Config.h:150
bool _skipBattlegrounds
Definition Config.h:152
bool _skipJunkMaps
Definition Config.h:151
bool _skipLiquid
Definition Config.h:149
bool isCurrentDirectory(const std::string &pathStr)
Definition Config.cpp:36
std::string executableDirectoryPath()
Definition PathCommon.h:39

References _dataDir, _debugOutput, _global, _maps, _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.

◆ 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().

◆ _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: