diff options
| author | Shauren <shauren.trinity@gmail.com> | 2018-04-22 01:01:48 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2018-04-22 01:01:48 +0200 |
| commit | edb2b16f546d18bb66f1527dddb6189f617ec1b3 (patch) | |
| tree | c3a2c3414f3abdf7cba62b570f2168b2b07a45ca /src/tools | |
| parent | a4892d64fe2433814e92c39cfe9b0c425c08aae5 (diff) | |
Tools/mmaps_generator: Give land priority during area merges over liquids
Closes #21700
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/mmaps_generator/MapBuilder.cpp | 13 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/PathGenerator.cpp | 71 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.cpp | 28 |
3 files changed, 73 insertions, 39 deletions
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 279d1fe7afc..e569693a317 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -618,7 +618,7 @@ namespace MMAP // mark all walkable tiles, both liquids and solids unsigned char* triFlags = new unsigned char[tTriCount]; - memset(triFlags, NAV_GROUND, tTriCount*sizeof(unsigned char)); + memset(triFlags, NAV_AREA_GROUND, tTriCount*sizeof(unsigned char)); rcClearUnwalkableTriangles(m_rcContext, tileCfg.walkableSlopeAngle, tVerts, tVertCount, tTris, tTriCount, triFlags); rcRasterizeTriangles(m_rcContext, tVerts, tVertCount, tTris, triFlags, tTriCount, *tile.solid, config.walkableClimb); delete[] triFlags; @@ -724,8 +724,15 @@ namespace MMAP // set polygons as walkable // TODO: special flags for DYNAMIC polygons, ie surfaces that can be turned on and off for (int i = 0; i < iv.polyMesh->npolys; ++i) - if (iv.polyMesh->areas[i] & RC_WALKABLE_AREA) - iv.polyMesh->flags[i] = iv.polyMesh->areas[i]; + { + if (uint8 area = iv.polyMesh->areas[i] & RC_WALKABLE_AREA) + { + if (area >= NAV_AREA_MAGMA_SLIME) + iv.polyMesh->flags[i] = 1 << (63 - area); + else + iv.polyMesh->flags[i] = NAV_GROUND; // TODO: these will be dynamic in future + } + } // setup mesh parameters dtNavMeshCreateParams params; diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp index 035bddd9063..185fe287848 100644 --- a/src/tools/mmaps_generator/PathGenerator.cpp +++ b/src/tools/mmaps_generator/PathGenerator.cpp @@ -31,6 +31,11 @@ using namespace MMAP; +namespace +{ + std::unordered_map<uint32, uint8> _liquidTypes; +} + bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales) { if (getDirContents(dbcLocales, "dbc") == LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty()) @@ -260,6 +265,43 @@ int finish(const char* message, int returnValue) return returnValue; } +std::unordered_map<uint32, uint8> LoadLiquid(std::string const& locale) +{ + DB2FileLoader liquidDb2; + std::unordered_map<uint32, uint8> liquidData; + DB2FileSystemSource liquidTypeSource((boost::filesystem::path("dbc") / locale / "LiquidType.db2").string()); + if (liquidDb2.Load(&liquidTypeSource, LiquidTypeLoadInfo::Instance())) + { + for (uint32 x = 0; x < liquidDb2.GetRecordCount(); ++x) + { + DB2Record record = liquidDb2.GetRecord(x); + liquidData[record.GetId()] = record.GetUInt8("SoundBank"); + } + } + + return liquidData; +} + +std::unordered_map<uint32, std::vector<uint32>> LoadMap(std::string const& locale) +{ + DB2FileLoader mapDb2; + std::unordered_map<uint32, std::vector<uint32>> mapData; + DB2FileSystemSource mapSource((boost::filesystem::path("dbc") / locale / "Map.db2").string()); + if (mapDb2.Load(&mapSource, MapLoadInfo::Instance())) + { + for (uint32 x = 0; x < mapDb2.GetRecordCount(); ++x) + { + DB2Record record = mapDb2.GetRecord(x); + mapData.emplace(std::piecewise_construct, std::forward_as_tuple(record.GetId()), std::forward_as_tuple()); + int16 parentMapId = int16(record.GetUInt16("ParentMapID")); + if (parentMapId != -1) + mapData[parentMapId].push_back(record.GetId()); + } + } + + return mapData; +} + int main(int argc, char** argv) { Trinity::Banner::Show("MMAP generator", [](char const* text) { printf("%s\n", text); }, nullptr); @@ -302,25 +344,20 @@ int main(int argc, char** argv) if (!checkDirectories(debugOutput, dbcLocales)) return silent ? -3 : finish("Press ENTER to close...", -3); - DB2FileLoader mapDb2; - std::unordered_map<uint32, std::vector<uint32>> mapData; - { - DB2FileSystemSource mapSource((boost::filesystem::path("dbc") / dbcLocales[0] / "Map.db2").string()); - if (!mapDb2.Load(&mapSource, MapLoadInfo::Instance())) - return silent ? -4 : finish("Failed to load Map.db2", -4); - - for (uint32 x = 0; x < mapDb2.GetRecordCount(); ++x) - { - DB2Record record = mapDb2.GetRecord(x); + _liquidTypes = LoadLiquid(dbcLocales[0]); + if (_liquidTypes.empty()) + return silent ? -5 : finish("Failed to load LiquidType.db2", -5); - mapData.emplace(std::piecewise_construct, std::forward_as_tuple(record.GetId()), std::forward_as_tuple()); - int16 parentMapId = int16(record.GetUInt16("ParentMapID")); - if (parentMapId != -1) - mapData[parentMapId].push_back(record.GetId()); - } + std::unordered_map<uint32, std::vector<uint32>> mapData = LoadMap(dbcLocales[0]); + if (mapData.empty()) + return silent ? -4 : finish("Failed to load Map.db2", -4); - static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->InitializeThreadUnsafe(mapData); - } + static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->InitializeThreadUnsafe(mapData); + static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->GetLiquidFlagsPtr = [](uint32 liquidId) -> uint32 + { + auto itr = _liquidTypes.find(liquidId); + return itr != _liquidTypes.end() ? (1 << itr->second) : 0; + }; MapBuilder builder(maxAngle, skipLiquid, skipContinents, skipJunkMaps, skipBattlegrounds, debugOutput, bigBaseUnit, mapnum, offMeshInputPath); diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 91ada500f97..1921cb9af2d 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -425,11 +425,9 @@ namespace MMAP useLiquid = false; } else if ((liquidType & (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN)) != 0) - liquidType = NAV_WATER; - else if (liquidType & MAP_LIQUID_TYPE_MAGMA) - liquidType = NAV_MAGMA; - else if (liquidType & MAP_LIQUID_TYPE_SLIME) - liquidType = NAV_SLIME; + liquidType = NAV_AREA_WATER; + else if ((liquidType & (MAP_LIQUID_TYPE_MAGMA | MAP_LIQUID_TYPE_SLIME)) != 0) + liquidType = NAV_AREA_MAGMA_SLIME; else useLiquid = false; } @@ -716,22 +714,14 @@ namespace MMAP vertsY = tilesY + 1; uint8* flags = liquid->GetFlagsStorage(); float* data = liquid->GetHeightStorage(); - uint8 type = NAV_EMPTY; + uint8 type = NAV_AREA_EMPTY; // convert liquid type to NavTerrain - switch (liquid->GetType() & 3) - { - case 0: - case 1: - type = NAV_WATER; - break; - case 2: - type = NAV_MAGMA; - break; - case 3: - type = NAV_SLIME; - break; - } + uint32 liquidFlags = vmapManager->GetLiquidFlagsPtr(liquid->GetType()); + if ((liquidFlags & (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN)) != 0) + type = NAV_AREA_WATER; + else if ((liquidFlags & (MAP_LIQUID_TYPE_MAGMA | MAP_LIQUID_TYPE_SLIME)) != 0) + type = NAV_AREA_MAGMA_SLIME; // indexing is weird... // after a lot of trial and error, this is what works: |
