mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Tools/mmaps_generator: Added --input and --output arguments
This commit is contained in:
@@ -1,5 +1,11 @@
|
||||
R"(Generator command line args
|
||||
|
||||
--input [path] Directory to use for reading maps and vmaps
|
||||
Default: current_directory
|
||||
|
||||
--output [path] Directory to write generated data to
|
||||
Default: current_directory
|
||||
|
||||
--threads [#] Max number of threads used by the generator
|
||||
Default: Same as CPU cores
|
||||
|
||||
|
||||
@@ -31,16 +31,16 @@ namespace MMAP
|
||||
rcFreePolyMeshDetail(polyMeshDetail);
|
||||
}
|
||||
|
||||
void IntermediateValues::writeIV(uint32 mapID, uint32 tileX, uint32 tileY)
|
||||
void IntermediateValues::writeIV(boost::filesystem::path const& outputDirectory, uint32 mapID, uint32 tileX, uint32 tileY)
|
||||
{
|
||||
TC_LOG_INFO("maps.mmapgen.debug", "[Map {:04}] [{:02},{:02}]: Writing debug output intermediate values...", mapID, tileX, tileY);
|
||||
|
||||
auto debugWrite = [&](char const* extension, auto const* data)
|
||||
auto debugWrite = [=, outputDirectory = outputDirectory.generic_string()](char const* extension, auto const* data)
|
||||
{
|
||||
std::string fileName = Trinity::StringFormat("meshes/{:04}{:02}{:02}.{}", mapID, tileX, tileY, extension);
|
||||
std::string fileName = Trinity::StringFormat("{}/meshes/{:04}{:02}{:02}.{}", outputDirectory, mapID, tileX, tileY, extension);
|
||||
if (auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "wb")))
|
||||
{
|
||||
this->debugWrite(file.get(), data);
|
||||
IntermediateValues::debugWrite(file.get(), data);
|
||||
}
|
||||
else
|
||||
TC_LOG_ERROR("maps.mmapgen.debug", "{}: [{:04}-{:02},{:02}] Failed to open {} for writing!", strerror(errno), mapID, tileX, tileY, fileName);
|
||||
@@ -188,10 +188,10 @@ namespace MMAP
|
||||
fwrite(mesh->meshes, sizeof(int), mesh->nmeshes*4, file);
|
||||
}
|
||||
|
||||
void IntermediateValues::generateObjFile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData const& meshData)
|
||||
void IntermediateValues::generateObjFile(boost::filesystem::path const& outputDirectory, uint32 mapID, uint32 tileX, uint32 tileY, MeshData const& meshData)
|
||||
{
|
||||
std::string objFileName;
|
||||
objFileName = Trinity::StringFormat("meshes/map{:04}{:02}{:02}.obj", mapID, tileX, tileY);
|
||||
objFileName = Trinity::StringFormat("{}/meshes/map{:04}{:02}{:02}.obj", outputDirectory.generic_string(), mapID, tileX, tileY);
|
||||
|
||||
auto objFile = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(objFileName.c_str(), "wb"));
|
||||
if (!objFile)
|
||||
@@ -221,7 +221,7 @@ namespace MMAP
|
||||
|
||||
TC_LOG_INFO("maps.mmapgen.debug", "[Map {:04}] [{:02},{:02}]: Writing debug output object file...", mapID, tileX, tileY);
|
||||
|
||||
objFileName = Trinity::StringFormat("meshes/map{:04}.map", mapID);
|
||||
objFileName = Trinity::StringFormat("{}/meshes/map{:04}.map", outputDirectory.generic_string(), mapID);
|
||||
|
||||
objFile.reset(fopen(objFileName.c_str(), "wb"));
|
||||
if (!objFile)
|
||||
@@ -233,7 +233,7 @@ namespace MMAP
|
||||
char b = '\0';
|
||||
fwrite(&b, sizeof(char), 1, objFile.get());
|
||||
|
||||
objFileName = Trinity::StringFormat("meshes/map{:04}{:02}{:02}.mesh", mapID, tileX, tileY);
|
||||
objFileName = Trinity::StringFormat("{}/meshes/map{:04}{:02}{:02}.mesh", outputDirectory.generic_string(), mapID, tileX, tileY);
|
||||
objFile.reset(fopen(objFileName.c_str(), "wb"));
|
||||
if (!objFile)
|
||||
{
|
||||
|
||||
@@ -64,15 +64,15 @@ namespace MMAP
|
||||
return *this;
|
||||
}
|
||||
|
||||
void writeIV(uint32 mapID, uint32 tileX, uint32 tileY);
|
||||
void writeIV(boost::filesystem::path const& outputDirectory, uint32 mapID, uint32 tileX, uint32 tileY);
|
||||
|
||||
void debugWrite(FILE* file, rcHeightfield const* mesh);
|
||||
void debugWrite(FILE* file, rcCompactHeightfield const* chf);
|
||||
void debugWrite(FILE* file, rcContourSet const* cs);
|
||||
void debugWrite(FILE* file, rcPolyMesh const* mesh);
|
||||
void debugWrite(FILE* file, rcPolyMeshDetail const* mesh);
|
||||
static void debugWrite(FILE* file, rcHeightfield const* mesh);
|
||||
static void debugWrite(FILE* file, rcCompactHeightfield const* chf);
|
||||
static void debugWrite(FILE* file, rcContourSet const* cs);
|
||||
static void debugWrite(FILE* file, rcPolyMesh const* mesh);
|
||||
static void debugWrite(FILE* file, rcPolyMeshDetail const* mesh);
|
||||
|
||||
void generateObjFile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData const& meshData);
|
||||
void generateObjFile(boost::filesystem::path const& outputDirectory, uint32 mapID, uint32 tileX, uint32 tileY, MeshData const& meshData);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace MMAP
|
||||
{
|
||||
MapTileBuilder::MapTileBuilder(MapBuilder* mapBuilder, Optional<float> maxWalkableAngle, Optional<float> maxWalkableAngleNotSteep,
|
||||
bool skipLiquid, bool bigBaseUnit, bool debugOutput, std::vector<OffMeshData> const* offMeshConnections) :
|
||||
TileBuilder(maxWalkableAngle, maxWalkableAngleNotSteep, skipLiquid, bigBaseUnit, debugOutput, offMeshConnections),
|
||||
TileBuilder(mapBuilder->m_inputDirectory, mapBuilder->m_outputDirectory, maxWalkableAngle, maxWalkableAngleNotSteep, skipLiquid, bigBaseUnit, debugOutput, offMeshConnections),
|
||||
m_mapBuilder(mapBuilder),
|
||||
m_workerThread(&MapTileBuilder::WorkerThread, this)
|
||||
{
|
||||
@@ -59,9 +59,12 @@ namespace MMAP
|
||||
++m_mapBuilder->m_totalTilesProcessed;
|
||||
}
|
||||
|
||||
MapBuilder::MapBuilder(Optional<float> maxWalkableAngle, Optional<float> maxWalkableAngleNotSteep, bool skipLiquid,
|
||||
MapBuilder::MapBuilder(boost::filesystem::path const& inputDirectory, boost::filesystem::path const& outputDirectory,
|
||||
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) :
|
||||
m_inputDirectory (inputDirectory),
|
||||
m_outputDirectory (outputDirectory),
|
||||
m_debugOutput (debugOutput),
|
||||
m_threads (threads),
|
||||
m_skipContinents (skipContinents),
|
||||
@@ -100,7 +103,7 @@ namespace MMAP
|
||||
void MapBuilder::discoverTiles()
|
||||
{
|
||||
boost::filesystem::directory_iterator end;
|
||||
for (auto itr = boost::filesystem::directory_iterator("maps"); itr != end; ++itr)
|
||||
for (auto itr = boost::filesystem::directory_iterator(m_inputDirectory / "maps"); itr != end; ++itr)
|
||||
{
|
||||
if (!boost::filesystem::is_regular_file(*itr))
|
||||
continue;
|
||||
@@ -138,7 +141,7 @@ namespace MMAP
|
||||
}
|
||||
}
|
||||
|
||||
for (auto itr = boost::filesystem::directory_iterator("vmaps"); itr != end; ++itr)
|
||||
for (auto itr = boost::filesystem::directory_iterator(m_inputDirectory / "vmaps"); itr != end; ++itr)
|
||||
{
|
||||
if (!boost::filesystem::is_directory(*itr))
|
||||
continue;
|
||||
@@ -278,7 +281,7 @@ namespace MMAP
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
void MapBuilder::buildMeshFromFile(char* name)
|
||||
void MapBuilder::buildMeshFromFile(char const* name)
|
||||
{
|
||||
auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(name, "rb"));
|
||||
if (!file)
|
||||
@@ -460,7 +463,7 @@ namespace MMAP
|
||||
return;
|
||||
}
|
||||
|
||||
std::string fileName = Trinity::StringFormat("mmaps/{:04}.mmap", mapID);
|
||||
std::string fileName = Trinity::StringFormat("{}/mmaps/{:04}.mmap", m_outputDirectory.generic_string(), mapID);
|
||||
|
||||
auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "wb"));
|
||||
if (!file)
|
||||
@@ -563,7 +566,7 @@ namespace MMAP
|
||||
/**************************************************************************/
|
||||
bool MapTileBuilder::shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY) const
|
||||
{
|
||||
std::string fileName = Trinity::StringFormat("mmaps/{:04}{:02}{:02}.mmtile", mapID, tileX, tileY);
|
||||
std::string fileName = Trinity::StringFormat("{}/mmaps/{:04}{:02}{:02}.mmtile", m_outputDirectory.generic_string(), mapID, tileX, tileY);
|
||||
auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "rb"));
|
||||
if (!file)
|
||||
return false;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "ProducerConsumerQueue.h"
|
||||
#include "TerrainBuilder.h"
|
||||
#include "TileBuilder.h"
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <DetourNavMesh.h>
|
||||
#include <atomic>
|
||||
#include <span>
|
||||
@@ -78,7 +79,9 @@ namespace MMAP
|
||||
friend class MapTileBuilder;
|
||||
|
||||
public:
|
||||
MapBuilder(Optional<float> maxWalkableAngle,
|
||||
MapBuilder(boost::filesystem::path const& inputDirectory,
|
||||
boost::filesystem::path const& outputDirectory,
|
||||
Optional<float> maxWalkableAngle,
|
||||
Optional<float> maxWalkableAngleNotSteep,
|
||||
bool skipLiquid,
|
||||
bool skipContinents,
|
||||
@@ -92,7 +95,7 @@ namespace MMAP
|
||||
|
||||
~MapBuilder();
|
||||
|
||||
void buildMeshFromFile(char* name);
|
||||
void buildMeshFromFile(char const* name);
|
||||
|
||||
// builds an mmap tile for the specified map and its mesh
|
||||
void buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY);
|
||||
@@ -122,6 +125,8 @@ namespace MMAP
|
||||
|
||||
TileList m_tiles;
|
||||
|
||||
boost::filesystem::path m_inputDirectory;
|
||||
boost::filesystem::path m_outputDirectory;
|
||||
bool m_debugOutput;
|
||||
|
||||
std::vector<OffMeshData> m_offMeshConnections;
|
||||
|
||||
@@ -15,64 +15,49 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _MMAP_COMMON_H
|
||||
#define _MMAP_COMMON_H
|
||||
#ifndef TRINITYCORE_MMAP_COMMON_H
|
||||
#define TRINITYCORE_MMAP_COMMON_H
|
||||
|
||||
#include "Define.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include "Common.h"
|
||||
#include <boost/filesystem/directory.hpp>
|
||||
#include <string_view>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <cstddef>
|
||||
#include <cstring>
|
||||
#include <dirent.h>
|
||||
#else
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <cerrno>
|
||||
#endif
|
||||
|
||||
namespace VMAP
|
||||
{
|
||||
class VMapManager;
|
||||
}
|
||||
|
||||
namespace MMAP
|
||||
{
|
||||
inline bool matchWildcardFilter(char const* filter, char const* str)
|
||||
inline bool matchWildcardFilter(std::string_view filter, std::string_view str)
|
||||
{
|
||||
if (!filter || !str)
|
||||
if (filter.empty() || str.empty())
|
||||
return false;
|
||||
|
||||
auto filterItr = filter.begin();
|
||||
auto filterEnd = filter.end();
|
||||
auto strItr = str.begin();
|
||||
auto strEnd = str.end();
|
||||
|
||||
// end on null character
|
||||
while (*filter && *str)
|
||||
while (filterItr != filterEnd && strItr != strEnd)
|
||||
{
|
||||
if (*filter == '*')
|
||||
if (*filterItr == '*')
|
||||
{
|
||||
if (*++filter == '\0') // wildcard at end of filter means all remaing chars match
|
||||
if (++filterItr == filterEnd) // wildcard at end of filter means all remaing chars match
|
||||
return true;
|
||||
|
||||
for (;;)
|
||||
while (*filterItr != *strItr)
|
||||
{
|
||||
if (*filter == *str)
|
||||
break;
|
||||
if (*str == '\0')
|
||||
if (strItr == strEnd)
|
||||
return false; // reached end of string without matching next filter character
|
||||
str++;
|
||||
++strItr;
|
||||
}
|
||||
}
|
||||
else if (*filter != *str)
|
||||
else if (*filterItr != *strItr)
|
||||
return false; // mismatch
|
||||
|
||||
filter++;
|
||||
str++;
|
||||
++filterItr;
|
||||
++strItr;
|
||||
}
|
||||
|
||||
return ((*filter == '\0' || (*filter == '*' && *++filter == '\0')) && *str == '\0');
|
||||
return (filterItr == filterEnd || (*filterItr == '*' && filterItr + 1 == filterEnd)) && strItr == strEnd;
|
||||
}
|
||||
|
||||
enum ListFilesResult
|
||||
@@ -81,50 +66,25 @@ namespace MMAP
|
||||
LISTFILE_OK = 1
|
||||
};
|
||||
|
||||
inline ListFilesResult getDirContents(std::vector<std::string> &fileList, std::string dirpath = ".", std::string filter = "*")
|
||||
inline ListFilesResult getDirContents(std::vector<std::string>& fileList, boost::filesystem::path const& dirpath,
|
||||
boost::filesystem::file_type type = boost::filesystem::regular_file, std::string_view filter = "*"sv)
|
||||
{
|
||||
#ifdef WIN32
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATAA findFileInfo;
|
||||
std::string directory;
|
||||
|
||||
directory = dirpath + "/" + filter;
|
||||
|
||||
hFind = FindFirstFileA(directory.c_str(), &findFileInfo);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
boost::system::error_code ec;
|
||||
boost::filesystem::directory_iterator dirItr(dirpath, ec);
|
||||
if (ec)
|
||||
return LISTFILE_DIRECTORY_NOT_FOUND;
|
||||
do
|
||||
|
||||
for (boost::filesystem::directory_entry const& dirEntry : dirItr)
|
||||
{
|
||||
if (strcmp(findFileInfo.cFileName, ".") != 0 && strcmp(findFileInfo.cFileName, "..") != 0)
|
||||
fileList.push_back(std::string(findFileInfo.cFileName));
|
||||
if (dirEntry.status(ec).type() != type || ec)
|
||||
continue;
|
||||
|
||||
std::string fileName = dirEntry.path().filename().string();
|
||||
if (!matchWildcardFilter(filter, fileName))
|
||||
continue;
|
||||
|
||||
fileList.push_back(std::move(fileName));
|
||||
}
|
||||
while (FindNextFileA(hFind, &findFileInfo));
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
#else
|
||||
const char *p = dirpath.c_str();
|
||||
DIR * dirp = opendir(p);
|
||||
struct dirent * dp;
|
||||
|
||||
while (dirp)
|
||||
{
|
||||
errno = 0;
|
||||
if ((dp = readdir(dirp)) != nullptr)
|
||||
{
|
||||
if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0 && matchWildcardFilter(filter.c_str(), dp->d_name))
|
||||
fileList.push_back(std::string(dp->d_name));
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (dirp)
|
||||
closedir(dirp);
|
||||
else
|
||||
return LISTFILE_DIRECTORY_NOT_FOUND;
|
||||
#endif
|
||||
|
||||
return LISTFILE_OK;
|
||||
}
|
||||
|
||||
@@ -87,9 +87,10 @@ void SetupLogging(Trinity::Asio::IoContext* ioContext)
|
||||
log->CreateLoggerFromConfigLine("Logger.maps.mmapgen", "2,Console"); // LOG_LEVEL_DEBUG | Console appender
|
||||
}
|
||||
|
||||
bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales)
|
||||
bool checkDirectories(boost::filesystem::path const& inputDirectory, boost::filesystem::path const& outputDirectory,
|
||||
bool debugOutput, std::vector<std::string>& dbcLocales)
|
||||
{
|
||||
if (MMAP::getDirContents(dbcLocales, "dbc") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty())
|
||||
if (MMAP::getDirContents(dbcLocales, inputDirectory / "dbc", boost::filesystem::directory_file) == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty())
|
||||
{
|
||||
TC_LOG_ERROR("tool.mmapgen", "'dbc' directory is empty or does not exist");
|
||||
return false;
|
||||
@@ -97,39 +98,32 @@ bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales)
|
||||
|
||||
std::vector<std::string> dirFiles;
|
||||
|
||||
if (MMAP::getDirContents(dirFiles, "maps") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
|
||||
if (MMAP::getDirContents(dirFiles, inputDirectory / "maps") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
|
||||
{
|
||||
TC_LOG_ERROR("tool.mmapgen", "'maps' directory is empty or does not exist");
|
||||
return false;
|
||||
}
|
||||
|
||||
dirFiles.clear();
|
||||
if (MMAP::getDirContents(dirFiles, "vmaps/0000", "*.vmtree") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
|
||||
if (MMAP::getDirContents(dirFiles, inputDirectory / "vmaps" / "0000", boost::filesystem::regular_file, "*.vmtree") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
|
||||
{
|
||||
TC_LOG_ERROR("tool.mmapgen", "'vmaps' directory is empty or does not exist");
|
||||
return false;
|
||||
}
|
||||
|
||||
dirFiles.clear();
|
||||
if (MMAP::getDirContents(dirFiles, "mmaps") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND)
|
||||
boost::system::error_code ec;
|
||||
if (!boost::filesystem::create_directories(outputDirectory / "mmaps", ec) && ec)
|
||||
{
|
||||
if (!boost::filesystem::create_directory("mmaps"))
|
||||
{
|
||||
TC_LOG_ERROR("tool.mmapgen", "'mmaps' directory does not exist and failed to create it");
|
||||
return false;
|
||||
}
|
||||
TC_LOG_ERROR("tool.mmapgen", "'mmaps' directory does not exist and failed to create it");
|
||||
return false;
|
||||
}
|
||||
|
||||
dirFiles.clear();
|
||||
if (debugOutput)
|
||||
{
|
||||
if (MMAP::getDirContents(dirFiles, "meshes") == MMAP::LISTFILE_DIRECTORY_NOT_FOUND)
|
||||
if (!boost::filesystem::create_directories(outputDirectory / "meshes", ec) && ec)
|
||||
{
|
||||
if (!boost::filesystem::create_directory("meshes"))
|
||||
{
|
||||
TC_LOG_ERROR("tool.mmapgen", "'meshes' directory does not exist and failed to create it (no place to put debugOutput files)");
|
||||
return false;
|
||||
}
|
||||
TC_LOG_ERROR("tool.mmapgen", "'meshes' directory does not exist and failed to create it (no place to put debugOutput files)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,21 +138,23 @@ int finish(char const* message, int returnValue)
|
||||
}
|
||||
|
||||
bool handleArgs(int argc, char** argv,
|
||||
int &mapnum,
|
||||
int &tileX,
|
||||
int &tileY,
|
||||
int& mapnum,
|
||||
int& tileX,
|
||||
int& tileY,
|
||||
Optional<float>& maxAngle,
|
||||
Optional<float>& maxAngleNotSteep,
|
||||
bool &skipLiquid,
|
||||
bool &skipContinents,
|
||||
bool &skipJunkMaps,
|
||||
bool &skipBattlegrounds,
|
||||
bool &debugOutput,
|
||||
bool &silent,
|
||||
bool &bigBaseUnit,
|
||||
char* &offMeshInputPath,
|
||||
char* &file,
|
||||
unsigned int& threads)
|
||||
bool& skipLiquid,
|
||||
bool& skipContinents,
|
||||
bool& skipJunkMaps,
|
||||
bool& skipBattlegrounds,
|
||||
bool& debugOutput,
|
||||
bool& silent,
|
||||
bool& bigBaseUnit,
|
||||
char const*& offMeshInputPath,
|
||||
char const*& file,
|
||||
unsigned int& threads,
|
||||
boost::filesystem::path& inputDirectory,
|
||||
boost::filesystem::path& outputDirectory)
|
||||
{
|
||||
char* param = nullptr;
|
||||
[[maybe_unused]] bool allowDebug = false;
|
||||
@@ -314,6 +310,22 @@ bool handleArgs(int argc, char** argv,
|
||||
|
||||
offMeshInputPath = param;
|
||||
}
|
||||
else if (strcmp(argv[i], "--input") == 0)
|
||||
{
|
||||
param = argv[++i];
|
||||
if (!param)
|
||||
return false;
|
||||
|
||||
inputDirectory = param;
|
||||
}
|
||||
else if (strcmp(argv[i], "--output") == 0)
|
||||
{
|
||||
param = argv[++i];
|
||||
if (!param)
|
||||
return false;
|
||||
|
||||
outputDirectory = param;
|
||||
}
|
||||
else if (strcmp(argv[i], "--allowDebug") == 0)
|
||||
{
|
||||
allowDebug = true;
|
||||
@@ -349,11 +361,11 @@ bool handleArgs(int argc, char** argv,
|
||||
return true;
|
||||
}
|
||||
|
||||
std::unordered_map<uint32, uint8> LoadLiquid(std::string const& locale, bool silent, int32 errorExitCode)
|
||||
std::unordered_map<uint32, uint8> LoadLiquid(boost::filesystem::path const& inputDirectory, std::string const& locale, bool silent, int32 errorExitCode)
|
||||
{
|
||||
DB2FileLoader liquidDb2;
|
||||
std::unordered_map<uint32, uint8> liquidData;
|
||||
DB2FileSystemSource liquidTypeSource((boost::filesystem::path("dbc") / locale / "LiquidType.db2").string());
|
||||
DB2FileSystemSource liquidTypeSource((inputDirectory / "dbc" / locale / "LiquidType.db2").string());
|
||||
try
|
||||
{
|
||||
liquidDb2.Load(&liquidTypeSource, &LiquidTypeLoadInfo::Instance);
|
||||
@@ -377,10 +389,10 @@ std::unordered_map<uint32, uint8> LoadLiquid(std::string const& locale, bool sil
|
||||
return liquidData;
|
||||
}
|
||||
|
||||
void LoadMap(std::string const& locale, bool silent, int32 errorExitCode)
|
||||
void LoadMap(boost::filesystem::path const& inputDirectory, std::string const& locale, bool silent, int32 errorExitCode)
|
||||
{
|
||||
DB2FileLoader mapDb2;
|
||||
DB2FileSystemSource mapSource((boost::filesystem::path("dbc") / locale / "Map.db2").string());
|
||||
DB2FileSystemSource mapSource((inputDirectory / "dbc" / locale / "Map.db2").string());
|
||||
try
|
||||
{
|
||||
mapDb2.Load(&mapSource, &MapLoadInfo::Instance);
|
||||
@@ -442,13 +454,16 @@ int main(int argc, char** argv)
|
||||
debugOutput = false,
|
||||
silent = false,
|
||||
bigBaseUnit = false;
|
||||
char* offMeshInputPath = nullptr;
|
||||
char* file = nullptr;
|
||||
char const* offMeshInputPath = nullptr;
|
||||
char const* file = nullptr;
|
||||
boost::filesystem::path inputDirectory = boost::filesystem::current_path();
|
||||
boost::filesystem::path outputDirectory = boost::filesystem::current_path();
|
||||
|
||||
bool validParam = handleArgs(argc, argv, mapnum,
|
||||
tileX, tileY, maxAngle, maxAngleNotSteep,
|
||||
skipLiquid, skipContinents, skipJunkMaps, skipBattlegrounds,
|
||||
debugOutput, silent, bigBaseUnit, offMeshInputPath, file, threads);
|
||||
debugOutput, silent, bigBaseUnit, offMeshInputPath, file, threads,
|
||||
inputDirectory, outputDirectory);
|
||||
|
||||
if (!validParam)
|
||||
return silent ? -1 : finish("You have specified invalid parameters", -1);
|
||||
@@ -466,14 +481,14 @@ int main(int argc, char** argv)
|
||||
}
|
||||
|
||||
std::vector<std::string> dbcLocales;
|
||||
if (!checkDirectories(debugOutput, dbcLocales))
|
||||
if (!checkDirectories(inputDirectory, outputDirectory, debugOutput, dbcLocales))
|
||||
return silent ? -3 : finish("Press ENTER to close...", -3);
|
||||
|
||||
_liquidTypes = LoadLiquid(dbcLocales[0], silent, -5);
|
||||
_liquidTypes = LoadLiquid(inputDirectory, dbcLocales[0], silent, -5);
|
||||
|
||||
LoadMap(dbcLocales[0], silent, -4);
|
||||
LoadMap(inputDirectory, dbcLocales[0], silent, -4);
|
||||
|
||||
MMAP::MapBuilder builder(maxAngle, maxAngleNotSteep, skipLiquid, skipContinents, skipJunkMaps,
|
||||
MMAP::MapBuilder builder(inputDirectory, outputDirectory, maxAngle, maxAngleNotSteep, skipLiquid, skipContinents, skipJunkMaps,
|
||||
skipBattlegrounds, debugOutput, bigBaseUnit, mapnum, offMeshInputPath, threads);
|
||||
|
||||
uint32 start = getMSTime();
|
||||
|
||||
@@ -29,7 +29,11 @@
|
||||
|
||||
namespace MMAP
|
||||
{
|
||||
TerrainBuilder::TerrainBuilder(bool skipLiquid) : m_skipLiquid (skipLiquid){ }
|
||||
TerrainBuilder::TerrainBuilder(boost::filesystem::path const& inputDirectory, bool skipLiquid) :
|
||||
m_inputDirectory(inputDirectory),
|
||||
m_skipLiquid (skipLiquid)
|
||||
{
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
void TerrainBuilder::getLoopVars(Spot portion, int& loopStart, int& loopEnd, int& loopInc)
|
||||
@@ -79,7 +83,7 @@ namespace MMAP
|
||||
/**************************************************************************/
|
||||
bool TerrainBuilder::loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager, Spot portion)
|
||||
{
|
||||
std::string mapFileName = Trinity::StringFormat("maps/{:04}_{:02}_{:02}.map", mapID, tileX, tileY);
|
||||
std::string mapFileName = Trinity::StringFormat("{}/maps/{:04}_{:02}_{:02}.map", m_inputDirectory.generic_string(), mapID, tileX, tileY);
|
||||
|
||||
auto mapFile = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(mapFileName.c_str(), "rb"));
|
||||
if (!mapFile)
|
||||
@@ -87,7 +91,7 @@ namespace MMAP
|
||||
int32 parentMapId = vmapManager->getParentMapId(mapID);
|
||||
while (!mapFile && parentMapId != -1)
|
||||
{
|
||||
mapFileName = Trinity::StringFormat("maps/{:04}_{:02}_{:02}.map", parentMapId, tileX, tileY);
|
||||
mapFileName = Trinity::StringFormat("{}/maps/{:04}_{:02}_{:02}.map", m_inputDirectory.generic_string(), parentMapId, tileX, tileY);
|
||||
mapFile.reset(fopen(mapFileName.c_str(), "rb"));
|
||||
parentMapId = vmapManager->getParentMapId(parentMapId);
|
||||
}
|
||||
@@ -563,7 +567,7 @@ namespace MMAP
|
||||
/**************************************************************************/
|
||||
bool TerrainBuilder::loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager)
|
||||
{
|
||||
VMAP::LoadResult result = vmapManager->loadMap("vmaps", mapID, tileX, tileY);
|
||||
VMAP::LoadResult result = vmapManager->loadMap((m_inputDirectory / "vmaps").string(), mapID, tileX, tileY);
|
||||
if (result != VMAP::LoadResult::Success)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "WorldModel.h"
|
||||
#include <G3D/Vector3.h>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
namespace VMAP
|
||||
{
|
||||
@@ -93,7 +94,7 @@ namespace MMAP
|
||||
class TerrainBuilder
|
||||
{
|
||||
public:
|
||||
explicit TerrainBuilder(bool skipLiquid);
|
||||
explicit TerrainBuilder(boost::filesystem::path const& inputDirectory, bool skipLiquid);
|
||||
|
||||
void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager);
|
||||
bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager);
|
||||
@@ -114,6 +115,8 @@ namespace MMAP
|
||||
/// Sets loop variables for selecting only certain parts of a map's terrain
|
||||
static void getLoopVars(Spot portion, int& loopStart, int& loopEnd, int& loopInc);
|
||||
|
||||
boost::filesystem::path m_inputDirectory;
|
||||
|
||||
/// Controls whether liquids are loaded
|
||||
bool m_skipLiquid;
|
||||
|
||||
|
||||
@@ -69,13 +69,15 @@ namespace MMAP
|
||||
int TILES_PER_MAP;
|
||||
};
|
||||
|
||||
TileBuilder::TileBuilder(Optional<float> maxWalkableAngle, Optional<float> maxWalkableAngleNotSteep,
|
||||
TileBuilder::TileBuilder(boost::filesystem::path const& inputDirectory, boost::filesystem::path const& outputDirectory,
|
||||
Optional<float> maxWalkableAngle, Optional<float> maxWalkableAngleNotSteep,
|
||||
bool skipLiquid, bool bigBaseUnit, bool debugOutput, std::vector<OffMeshData> const* offMeshConnections) :
|
||||
m_outputDirectory(outputDirectory),
|
||||
m_maxWalkableAngle(maxWalkableAngle),
|
||||
m_maxWalkableAngleNotSteep(maxWalkableAngleNotSteep),
|
||||
m_bigBaseUnit(bigBaseUnit),
|
||||
m_debugOutput(debugOutput),
|
||||
m_terrainBuilder(skipLiquid),
|
||||
m_terrainBuilder(inputDirectory, skipLiquid),
|
||||
m_rcContext(false),
|
||||
m_offMeshConnections(offMeshConnections)
|
||||
{
|
||||
@@ -375,7 +377,7 @@ namespace MMAP
|
||||
// will hold final navmesh
|
||||
unsigned char* navData = nullptr;
|
||||
|
||||
auto debugOutputWriter = Trinity::make_unique_ptr_with_deleter(m_debugOutput ? &iv : nullptr, [=, borderSize = static_cast<unsigned short>(config.borderSize), &meshData](IntermediateValues* intermediate)
|
||||
auto debugOutputWriter = Trinity::make_unique_ptr_with_deleter(m_debugOutput ? &iv : nullptr, [borderSize = static_cast<unsigned short>(config.borderSize), outputDir = &m_outputDirectory, mapID, tileX, tileY, &meshData](IntermediateValues* intermediate)
|
||||
{
|
||||
// restore padding so that the debug visualization is correct
|
||||
for (std::ptrdiff_t i = 0; i < intermediate->polyMesh->nverts; ++i)
|
||||
@@ -385,8 +387,8 @@ namespace MMAP
|
||||
v[2] += borderSize;
|
||||
}
|
||||
|
||||
intermediate->generateObjFile(mapID, tileX, tileY, meshData);
|
||||
intermediate->writeIV(mapID, tileX, tileY);
|
||||
intermediate->generateObjFile(*outputDir, mapID, tileX, tileY, meshData);
|
||||
intermediate->writeIV(*outputDir, mapID, tileX, tileY);
|
||||
});
|
||||
|
||||
// these values are checked within dtCreateNavMeshData - handle them here
|
||||
@@ -462,7 +464,7 @@ namespace MMAP
|
||||
}
|
||||
|
||||
// file output
|
||||
std::string fileName = Trinity::StringFormat("mmaps/{:04}{:02}{:02}.mmtile", mapID, tileX, tileY);
|
||||
std::string fileName = Trinity::StringFormat("{}/mmaps/{:04}{:02}{:02}.mmtile", m_outputDirectory.generic_string(), mapID, tileX, tileY);
|
||||
auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "wb"));
|
||||
if (!file)
|
||||
{
|
||||
|
||||
@@ -34,7 +34,9 @@ using detour_unique_ptr = std::unique_ptr<unsigned char, decltype(Trinity::uniqu
|
||||
class TileBuilder
|
||||
{
|
||||
public:
|
||||
TileBuilder(Optional<float> maxWalkableAngle,
|
||||
TileBuilder(boost::filesystem::path const& inputDirectory,
|
||||
boost::filesystem::path const& outputDirectory,
|
||||
Optional<float> maxWalkableAngle,
|
||||
Optional<float> maxWalkableAngleNotSteep,
|
||||
bool skipLiquid,
|
||||
bool bigBaseUnit,
|
||||
@@ -79,7 +81,8 @@ public:
|
||||
|
||||
virtual void OnTileDone() { }
|
||||
|
||||
private:
|
||||
protected:
|
||||
boost::filesystem::path m_outputDirectory;
|
||||
Optional<float> m_maxWalkableAngle;
|
||||
Optional<float> m_maxWalkableAngleNotSteep;
|
||||
bool m_bigBaseUnit;
|
||||
|
||||
Reference in New Issue
Block a user