aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/mesh_extractor/ChunkedData.cpp4
-rw-r--r--src/tools/mesh_extractor/Constants.h11
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp16
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp2
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp8
-rw-r--r--src/tools/mesh_extractor/MPQ.cpp1
-rw-r--r--src/tools/mesh_extractor/MPQ.h2
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp61
-rw-r--r--src/tools/mesh_extractor/MPQManager.h6
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp93
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp75
-rw-r--r--src/tools/mesh_extractor/TileBuilder.h4
-rw-r--r--src/tools/mesh_extractor/Utils.cpp38
-rw-r--r--src/tools/mesh_extractor/Utils.h2
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp8
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp2
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.cpp6
17 files changed, 264 insertions, 75 deletions
diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp
index 4431993e3d1..4d609d8f6b2 100644
--- a/src/tools/mesh_extractor/ChunkedData.cpp
+++ b/src/tools/mesh_extractor/ChunkedData.cpp
@@ -48,7 +48,7 @@ void ChunkedData::Load( uint32 maxLength, uint32 chunksHint )
int ChunkedData::GetFirstIndex( std::string name )
{
- for (int i = 0; i < Chunks.size(); ++i)
+ for (uint32 i = 0; i < Chunks.size(); ++i)
if (Chunks[i]->Name == name)
return i;
return -1;
@@ -56,7 +56,7 @@ int ChunkedData::GetFirstIndex( std::string name )
Chunk* ChunkedData::GetChunkByName( std::string name )
{
- for (int i = 0; i < Chunks.size(); ++i)
+ for (uint32 i = 0; i < Chunks.size(); ++i)
if (Chunks[i]->Name == name)
return Chunks[i];
return NULL;
diff --git a/src/tools/mesh_extractor/Constants.h b/src/tools/mesh_extractor/Constants.h
index f44d5f16797..f3b71812155 100644
--- a/src/tools/mesh_extractor/Constants.h
+++ b/src/tools/mesh_extractor/Constants.h
@@ -29,6 +29,17 @@ public:
POLY_FLAG_SWIM = 2,
POLY_FLAG_FLIGHTMASTER = 4
};
+
+ enum ExtractFlags
+ {
+ EXTRACT_FLAG_DBC = 1,
+ EXTRACT_FLAG_MAPS = 2,
+ EXTRACT_FLAG_VMAPS = 4,
+ EXTRACT_FLAG_GOB_MODELS = 8,
+ EXTRACT_FLAG_MMAPS = 16,
+ EXTRACT_FLAG_ALLOWED = EXTRACT_FLAG_DBC | EXTRACT_FLAG_MAPS | EXTRACT_FLAG_VMAPS | EXTRACT_FLAG_GOB_MODELS | EXTRACT_FLAG_MMAPS
+ };
+
static const float TileSize;
static const float MaxXY;
static const float ChunkSize;
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
index 984f6170357..e4a1d2ca9f4 100644
--- a/src/tools/mesh_extractor/ContinentBuilder.cpp
+++ b/src/tools/mesh_extractor/ContinentBuilder.cpp
@@ -13,8 +13,9 @@ private:
int X, Y, MapId;
std::string Continent;
bool debug;
+ dtNavMeshParams Params;
public:
- BuilderThread(bool deb) : Free(true), debug(deb) {}
+ BuilderThread(bool deb, dtNavMeshParams& params) : Free(true), debug(deb), Params(params) {}
void SetData(int x, int y, int map, std::string cont) { X = x; Y = y; MapId = map; Continent = cont; }
int svc()
@@ -32,7 +33,7 @@ public:
Free = true;
return 0;
}
- uint8* nav = builder.Build(debug);
+ uint8* nav = builder.Build(debug, Params);
if (nav)
{
f = fopen(buff, "wb");
@@ -101,14 +102,17 @@ void ContinentBuilder::Build(bool debug)
dtNavMeshParams params;
params.maxPolys = 32768;
params.maxTiles = TileMap->TileTable.size();
- rcVcopy(params.orig, bmin);
- params.tileHeight = 533.33333f;
- params.tileWidth = 533.33333f;
+ // rcVcopy(params.orig, bmin);
+ params.orig[0] = Constants::Origin[0];
+ params.orig[1] = 0;
+ params.orig[2] = Constants::Origin[2];
+ params.tileHeight = Constants::TileSize;
+ params.tileWidth = Constants::TileSize;
fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
fclose(mmap);
std::vector<BuilderThread*> Threads;
for (uint32 i = 0; i < NumberOfThreads; ++i)
- Threads.push_back(new BuilderThread(debug));
+ Threads.push_back(new BuilderThread(debug, params));
printf("Map %s ( %i ) has %i tiles. Building them with %i threads\n", Continent.c_str(), MapId, TileMap->TileTable.size(), NumberOfThreads);
for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
{
diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp
index 363f07b4578..4e8028b3dff 100644
--- a/src/tools/mesh_extractor/DoodadHandler.cpp
+++ b/src/tools/mesh_extractor/DoodadHandler.cpp
@@ -31,7 +31,7 @@ void DoodadHandler::ProcessInternal( ChunkedData* subChunks )
{
int32 index;
fread(&index, sizeof(int32), 1, stream);
- if (index < 0 || index >= _definitions->size())
+ if (index < 0 || uint32(index) >= _definitions->size())
continue;
DoodadDefinition doodad = (*_definitions)[index];
if (_drawn.find(doodad.UniqueId) != _drawn.end())
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
index 5b998d75db9..7844130ab34 100644
--- a/src/tools/mesh_extractor/LiquidHandler.cpp
+++ b/src/tools/mesh_extractor/LiquidHandler.cpp
@@ -34,10 +34,10 @@ void LiquidHandler::HandleNewLiquid()
H2OInformation information = H2OInformation::Read(stream);
float** heights = new float*[9];
- for (int i = 0; i < 9; ++i)
+ for (int j = 0; j < 9; ++i)
{
- heights[i] = new float[9];
- memset(heights[i], 0, sizeof(float) * 9);
+ heights[j] = new float[9];
+ memset(heights[j], 0, sizeof(float) * 9);
}
H2ORenderMask renderMask;
@@ -52,7 +52,7 @@ void LiquidHandler::HandleNewLiquid()
uint8* altMask = new uint8[size];
fread(altMask, sizeof(uint8), size, stream);
- for (int mi = 0; mi < size; mi++)
+ for (uint32 mi = 0; mi < size; mi++)
renderMask.Mask[mi + information.OffsetY] |= altMask[mi];
delete[] altMask;
}
diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp
index 699b0a5014c..b7be181594d 100644
--- a/src/tools/mesh_extractor/MPQ.cpp
+++ b/src/tools/mesh_extractor/MPQ.cpp
@@ -31,6 +31,7 @@ MPQArchive::MPQArchive(const char* filename)
break;
}
}
+ GetFileListTo(Files);
}
void MPQArchive::close()
diff --git a/src/tools/mesh_extractor/MPQ.h b/src/tools/mesh_extractor/MPQ.h
index dd566bccff5..15fce452726 100644
--- a/src/tools/mesh_extractor/MPQ.h
+++ b/src/tools/mesh_extractor/MPQ.h
@@ -16,6 +16,8 @@ class MPQArchive
public:
mpq_archive_s *mpq_a;
+
+ vector<string> Files;
MPQArchive(const char* filename);
void close();
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
index 608eef1547a..90491dfb945 100644
--- a/src/tools/mesh_extractor/MPQManager.cpp
+++ b/src/tools/mesh_extractor/MPQManager.cpp
@@ -15,7 +15,7 @@ char* MPQManager::Files[] = {
"patch-3.MPQ"
};
-char* MPQManager::Languages[] = { "esES", "enUS", "enGB", "esMX", "deDE" };
+char* MPQManager::Languages[] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" };
void MPQManager::Initialize()
{
@@ -31,21 +31,38 @@ void MPQManager::Initialize()
void MPQManager::InitializeDBC()
{
- CurLocale = 0;
+ BaseLocale = -1;
std::string fileName;
uint32 size = sizeof(Languages) / sizeof(char*);
+ MPQArchive* _baseLocale = NULL;
for (uint32 i = 0; i < size; ++i)
{
- fileName = "Data/" + std::string(Languages[i]) + "/locale-" + std::string(Languages[i]) + ".MPQ";
- FILE* file = fopen(fileName.c_str(), "rb");
+ std::string _fileName = "Data/" + std::string(Languages[i]) + "/locale-" + std::string(Languages[i]) + ".MPQ";
+ FILE* file = fopen(_fileName.c_str(), "rb");
if (file)
{
- CurLocale = i;
- break;
+ if (BaseLocale == -1)
+ {
+ BaseLocale = i;
+ _baseLocale = new MPQArchive(_fileName.c_str());
+ fileName = _fileName;
+ LocaleFiles[i] = _baseLocale;
+ }
+ else
+ LocaleFiles[i] = new MPQArchive(_fileName.c_str());
+
+ AvailableLocales.insert(i);
+ printf("Detected locale: %s\n", Languages[i]);
}
}
- Archives.push_front(new MPQArchive(fileName.c_str()));
- printf("Using locale: %s\n", Languages[CurLocale]);
+ Archives.push_front(_baseLocale);
+ if (BaseLocale == -1)
+ {
+ printf("No locale data detected\n");
+ ASSERT(false);
+ }
+ else
+ printf("Using default locale: %s\n", Languages[BaseLocale]);
}
FILE* MPQManager::GetFile( std::string path )
@@ -62,3 +79,31 @@ DBC* MPQManager::GetDBC( std::string name )
std::string path = "DBFilesClient\\" + name + ".dbc";
return new DBC(GetFile(path));
}
+
+FILE* MPQManager::GetFileFrom( std::string path, MPQArchive* file )
+{
+ ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
+ mpq_archive* mpq_a = file->mpq_a;
+
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, path.c_str(), &filenum))
+ return NULL;
+
+ libmpq__off_t transferred;
+ libmpq__off_t size = 0;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ // HACK: in patch.mpq some files don't want to open and give 1 for filesize
+ if (size <= 1)
+ return NULL;
+
+ uint8* buffer = new uint8[size];
+
+ //libmpq_file_getdata
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+
+ // Pack the return into a FILE stream
+ FILE* ret = tmpfile();
+ fwrite(buffer, sizeof(uint8), size, ret);
+ return ret;
+}
diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h
index 0050dc5218a..c23d7177825 100644
--- a/src/tools/mesh_extractor/MPQManager.h
+++ b/src/tools/mesh_extractor/MPQManager.h
@@ -13,10 +13,14 @@ public:
void Initialize();
FILE* GetFile(std::string path);
+ FILE* GetFileFrom(std::string path, MPQArchive* file);
DBC* GetDBC(std::string name);
+ std::vector<std::string> GetAllFiles(std::string extension);
std::deque<MPQArchive*> Archives;
- uint32 CurLocale;
+ int32 BaseLocale;
+ std::set<uint32> AvailableLocales;
+ std::map<uint32, MPQArchive*> LocaleFiles;
static char* Files[];
static char* Languages[];
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
index 9d88fcdcdfc..d6b701607ba 100644
--- a/src/tools/mesh_extractor/MeshExtractor.cpp
+++ b/src/tools/mesh_extractor/MeshExtractor.cpp
@@ -3,6 +3,7 @@
#include "ContinentBuilder.h"
#include "Cache.h"
#include "DBC.h"
+#include "Constants.h"
#include <set>
@@ -14,7 +15,7 @@ LoginDatabaseWorkerPool LoginDatabase;
MPQManager* MPQHandler;
CacheClass* Cache;
-void ExtractAllMaps(std::set<uint32>& mapIds, uint32 threads, bool debug)
+void ExtractMMaps(std::set<uint32>& mapIds, uint32 threads, bool debug)
{
DBC* dbc = MPQHandler->GetDBC("Map");
for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
@@ -35,9 +36,45 @@ void ExtractAllMaps(std::set<uint32>& mapIds, uint32 threads, bool debug)
}
}
-bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapList, bool& debugOutput)
+void ExtractDBCs()
+{
+ printf("Extracting DBCs\n");
+ // Create the filesystem structure
+ std::string baseDBCPath = "dbc/";
+ Utils::CreateDir(baseDBCPath);
+
+ // Populate list of DBC files
+ std::set<std::string> DBCFiles;
+ for (std::vector<std::string>::iterator itr = MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.begin(); itr != MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.end(); ++itr)
+ if (itr->rfind(".dbc") == itr->length() - strlen(".dbc"))
+ DBCFiles.insert(*itr);
+
+ // Iterate over all available locales
+ for (std::set<uint32>::iterator itr = MPQHandler->AvailableLocales.begin(); itr != MPQHandler->AvailableLocales.end(); ++itr)
+ {
+ printf("Extracting DBCs for locale %s\n", MPQManager::Languages[*itr]);
+ std::string path = baseDBCPath;
+ if (*itr != MPQHandler->BaseLocale)
+ {
+ path += std::string(MPQManager::Languages[*itr]) + "/";
+ Utils::CreateDir(path);
+ }
+
+ std::string component = "component.wow-" + std::string(MPQManager::Languages[*itr]) + ".txt";
+ // Extract the component file
+ Utils::SaveToDisk(MPQHandler->GetFile(component), path + component);
+ // Extract the DBC files for the given locale
+ for (std::set<std::string>::iterator itr2 = DBCFiles.begin(); itr2 != DBCFiles.end(); ++itr2)
+ Utils::SaveToDisk(MPQHandler->GetFileFrom(*itr2, MPQHandler->LocaleFiles[*itr]), path + (itr2->c_str() + strlen("DBFilesClient\\")));
+ }
+ printf("DBC extraction finished!\n");
+}
+
+bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapList, bool& debugOutput, uint32& extractFlags)
{
char* param = NULL;
+ extractFlags = 0;
+
for (int i = 1; i < argc; ++i)
{
if (strcmp(argv[i], "--threads") == 0)
@@ -49,7 +86,7 @@ bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapLis
threads = atoi(param);
printf("Using %i threads\n", threads);
}
- if (strcmp(argv[i], "--maps") == 0)
+ else if (strcmp(argv[i], "--maps") == 0)
{
param = argv[++i];
if (!param)
@@ -62,13 +99,32 @@ bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapLis
printf("Extracting only provided list of maps (%u).\n", mapList.size());
}
- if (strcmp(argv[i], "--debug") == 0)
+ else if (strcmp(argv[i], "--debug") == 0)
{
param = argv[++i];
if (!param)
return false;
debugOutput = atoi(param);
- printf("Output will contain debug information (.obj files)\n");
+ if (debugOutput)
+ printf("Output will contain debug information (.obj files)\n");
+ }
+ else if (strcmp(argv[i], "--extract") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ extractFlags = atoi(param);
+
+ if (!(extractFlags & Constants::EXTRACT_FLAG_ALLOWED)) // Tried to use an invalid flag
+ return false;
+
+ printf("Detected flags: \n");
+ printf("* Extract DBCs: %s\n", (extractFlags & Constants::EXTRACT_FLAG_DBC) ? "Yes" : "No");
+ printf("* Extract Maps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MAPS) ? "Yes" : "No");
+ printf("* Extract VMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_VMAPS) ? "Yes" : "No");
+ printf("* Extract GameObject Models: %s\n", (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS) ? "Yes" : "No");
+ printf("* Extract MMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MMAPS) ? "Yes" : "No");
}
}
return true;
@@ -77,9 +133,17 @@ bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapLis
void PrintUsage()
{
printf("MeshExtractor help.\n");
- printf("* Use \"--threads <number>\" to specify <number> threads, default to 4\n");
- printf("* Use \"--maps a,b,c,d,e\" to extract only the maps specified ( do not use spaces )\n");
- printf("* Use \"--debug 1\" to generate debug information of the tiles.\n");
+ printf("* Use \"--threads <number>\" to specify <number> threads, default to 4 (Only available when extracting MMaps)\n");
+ printf("* Use \"--maps a,b,c,d,e\" to extract only the maps specified (Do not use spaces)\n");
+ printf("* Use \"--debug 1\" to generate debug information of the tiles (Only available when extracting MMaps)\n");
+ printf("* Use \"--extract X\" to extract the data specified by the flag X (Note: You can combine the flags with the bitwise OR operator |). Available flags are: \n");
+ {
+ printf("- %u to extract DBCs\n", Constants::EXTRACT_FLAG_DBC);
+ printf("- %u to extract Maps (Not yet implemented)\n", Constants::EXTRACT_FLAG_MAPS);
+ printf("- %u to extract VMaps (Not yet implemented)\n", Constants::EXTRACT_FLAG_VMAPS);
+ printf("- %u to extract GameObject models (Not yet implemented)\n", Constants::EXTRACT_FLAG_GOB_MODELS);
+ printf("- %u to extract MMaps (Not yet finished)\n", Constants::EXTRACT_FLAG_MMAPS);
+ }
}
int main(int argc, char* argv[])
@@ -88,16 +152,21 @@ int main(int argc, char* argv[])
Cache = new CacheClass();
MPQHandler = new MPQManager();
MPQHandler->Initialize();
- uint32 threads = 4;
+ uint32 threads = 4, extractFlags = 0;
std::set<uint32> mapIds;
bool debug = false;
-
- if (!HandleArgs(argc, argv, threads, mapIds, debug))
+
+ if (!HandleArgs(argc, argv, threads, mapIds, debug, extractFlags))
{
PrintUsage();
return -1;
}
- ExtractAllMaps(mapIds, threads, debug);
+ if (extractFlags & Constants::EXTRACT_FLAG_DBC)
+ ExtractDBCs();
+
+ if (extractFlags & Constants::EXTRACT_FLAG_MMAPS)
+ ExtractMMaps(mapIds, threads, debug);
+
return 0;
} \ No newline at end of file
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
index 54b9e4865cd..5b3e181713e 100644
--- a/src/tools/mesh_extractor/TileBuilder.cpp
+++ b/src/tools/mesh_extractor/TileBuilder.cpp
@@ -26,9 +26,9 @@ TileBuilder::TileBuilder(std::string world, int x, int y, uint32 mapId) : _Geome
Config.walkableSlopeAngle = 50.0f;
Config.detailSampleDist = 3.0f;
Config.detailSampleMaxError = 1.25f;
- Config.walkableClimb = 1.0f / Config.ch;
- Config.walkableHeight = 1.652778f / Config.ch;
- Config.walkableRadius = 0.2951389f / Config.cs;
+ Config.walkableClimb = floorf(1.0f / Config.ch);
+ Config.walkableHeight = ceilf(1.652778f / Config.ch);
+ Config.walkableRadius = ceilf(0.2951389f / Config.cs);
Config.maxEdgeLen = Config.walkableRadius * 8;
Config.borderSize = Config.walkableRadius + 4;
Config.width = 1800 + Config.borderSize * 2;
@@ -39,17 +39,17 @@ TileBuilder::TileBuilder(std::string world, int x, int y, uint32 mapId) : _Geome
Context = new rcContext;
}
-void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax )
+void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams )
{
bmin = new float[3];
bmax = new float[3];
- bmin[0] = Constants::Origin[0] + (Constants::TileSize * X);
- bmin[2] = Constants::Origin[2] + (Constants::TileSize * Y);
- bmax[0] = Constants::Origin[0] + (Constants::TileSize * (X + 1));
- bmax[2] = Constants::Origin[2] + (Constants::TileSize * (Y + 1));
+ bmin[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * X);
+ bmin[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * Y);
+ bmax[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * (X + 1));
+ bmax[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * (Y + 1));
}
-uint8* TileBuilder::Build(bool dbg)
+uint8* TileBuilder::Build(bool dbg, dtNavMeshParams& navMeshParams)
{
_Geometry = new Geometry();
_Geometry->Transform = true;
@@ -61,15 +61,10 @@ uint8* TileBuilder::Build(bool dbg)
if (_Geometry->Vertices.empty() && _Geometry->Triangles.empty())
return NULL;
- float* bbMin;
- float* bbMax;
- CalculateTileBounds(bbMin, bbMax);
- _Geometry->CalculateMinMaxHeight(bbMin[1], bbMax[1]);
-
// again, we load everything - wasteful but who cares
- for (int ty = Y - 4; ty <= Y + 4; ty++)
+ for (int ty = Y - 2; ty <= Y + 2; ty++)
{
- for (int tx = X - 4; tx <= X + 4; tx++)
+ for (int tx = X - 2; tx <= X + 2; tx++)
{
// don't load main tile again
if (tx == X && ty == Y)
@@ -109,13 +104,23 @@ uint8* TileBuilder::Build(bool dbg)
_Geometry->Vertices.clear();
_Geometry->Triangles.clear();
- bbMin[0] -= Config.borderSize * Config.cs;
+ float bbMin[3];
+ float bbMax[3];
+ // CalculateTileBounds(bbMin, bbMax, navMeshParams);
+ rcCalcBounds(vertices, numVerts, bbMin, bbMax);
+ // _Geometry->CalculateMinMaxHeight(bbMin[1], bbMax[1]);
+
+ /*bbMin[0] -= Config.borderSize * Config.cs;
bbMin[2] -= Config.borderSize * Config.cs;
bbMax[0] += Config.borderSize * Config.cs;
- bbMax[0] += Config.borderSize * Config.cs;
+ bbMax[0] += Config.borderSize * Config.cs;*/
+
rcHeightfield* hf = rcAllocHeightfield();
- rcCreateHeightfield(Context, *hf, Config.width, Config.height, bbMin, bbMax, Config.cs, Config.ch);
+ int height, width;
+ rcCalcGridSize(bbMin, bbMax, Config.cs, &width, &height);
+ printf("Config values: Height: %i, Width: %i. Calculated values: Height: %i, Width: %i\n", Config.height, Config.width, height, width);
+ rcCreateHeightfield(Context, *hf, width, height, bbMin, bbMax, Config.cs, Config.ch);
rcClearUnwalkableTriangles(Context, Config.walkableSlopeAngle, vertices, numVerts, triangles, numTris, areas);
rcRasterizeTriangles(Context, vertices, numVerts, triangles, areas, numTris, *hf, Config.walkableClimb);
@@ -168,29 +173,31 @@ uint8* TileBuilder::Build(bool dbg)
rcFreeCompactHeightfield(chf);
rcFreeContourSet(cset);
+ /*
+ * Removed with RecastNavigation v292
// Remove padding from the polymesh data. (Remove this odditity)
for (int i = 0; i < pmesh->nverts; ++i)
{
unsigned short* v = &pmesh->verts[i * 3];
v[0] -= (unsigned short)Config.borderSize;
v[2] -= (unsigned short)Config.borderSize;
- }
+ }*/
// Set flags according to area types (e.g. Swim for Water)
for (int i = 0; i < pmesh->npolys; i++)
{
if (pmesh->areas[i] == Constants::POLY_AREA_ROAD || pmesh->areas[i] == Constants::POLY_AREA_TERRAIN)
pmesh->flags[i] = Constants::POLY_FLAG_WALK;
- else if (pmesh->areas[i] == (int)Constants::POLY_AREA_WATER)
+ else if (pmesh->areas[i] == Constants::POLY_AREA_WATER)
pmesh->flags[i] = Constants::POLY_FLAG_SWIM;
}
// get original bounds
- float* tilebMin;
+ /*float* tilebMin;
float* tilebMax;
- CalculateTileBounds(tilebMin, tilebMax);
+ CalculateTileBounds(tilebMin, tilebMax, navMeshParams);
tilebMin[1] = bbMin[1];
- tilebMax[1] = bbMax[1];
+ tilebMax[1] = bbMax[1];*/
dtNavMeshCreateParams params;
// PolyMesh data
@@ -208,12 +215,14 @@ uint8* TileBuilder::Build(bool dbg)
params.detailTris = dmesh->tris;
params.detailTriCount = dmesh->ntris;
// Copy bounding box
- params.bmin[0] = tilebMin[0];
+ /*params.bmin[0] = tilebMin[0];
params.bmin[1] = tilebMin[1];
params.bmin[2] = tilebMin[2];
params.bmax[0] = tilebMax[0];
params.bmax[1] = tilebMax[1];
- params.bmax[2] = tilebMax[2];
+ params.bmax[2] = tilebMax[2];*/
+ rcVcopy(params.bmin, pmesh->bmin);
+ rcVcopy(params.bmax, pmesh->bmax);
// General settings
params.ch = Config.ch;
params.cs = Config.cs;
@@ -222,7 +231,11 @@ uint8* TileBuilder::Build(bool dbg)
params.walkableRadius = Config.walkableRadius;
params.tileX = X;
params.tileY = Y;
- params.tileSize = 1800;
+ int _x = (((pmesh->bmin[0] + pmesh->bmax[0]) / 2) - Constants::Origin[0]) / Constants::TileSize;
+ int _y = (((pmesh->bmin[2] + pmesh->bmax[2]) / 2) - Constants::Origin[2]) / Constants::TileSize;
+ printf("[%02i,%02i] Generated with TileX: %i and TileY: %i\nbmin[0] %f bmin[1] %f bmin[2] %f bmax[0] %f bmax[1] %f bmax[2] %f\n", X, Y, _x, _y, params.bmin[0], params.bmin[1], params.bmin[2], params.bmax[0], params.bmax[1], params.bmax[2]);
+ params.buildBvTree = true;
+ params.tileLayer = 0;
// Offmesh-connection settings
params.offMeshConCount = 0; // none for now
@@ -235,13 +248,13 @@ uint8* TileBuilder::Build(bool dbg)
// Free some memory
rcFreePolyMesh(pmesh);
rcFreePolyMeshDetail(dmesh);
- delete tilebMax;
- delete tilebMin;
+ //delete tilebMax;
+ //delete tilebMin;
delete areas;
delete triangles;
delete vertices;
- delete bbMax;
- delete bbMin;
+ //delete bbMax;
+ //delete bbMin;
if (result)
{
diff --git a/src/tools/mesh_extractor/TileBuilder.h b/src/tools/mesh_extractor/TileBuilder.h
index 72e275c75b7..17d6e48095a 100644
--- a/src/tools/mesh_extractor/TileBuilder.h
+++ b/src/tools/mesh_extractor/TileBuilder.h
@@ -13,8 +13,8 @@ public:
TileBuilder(std::string world, int x, int y, uint32 mapId);
~TileBuilder();
- void CalculateTileBounds(float*& bmin, float*& bmax);
- uint8* Build(bool dbg);
+ void CalculateTileBounds(float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams);
+ uint8* Build(bool dbg, dtNavMeshParams& navMeshParams);
std::string World;
int X;
diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
index 6389e0aa66e..5b752885d17 100644
--- a/src/tools/mesh_extractor/Utils.cpp
+++ b/src/tools/mesh_extractor/Utils.cpp
@@ -5,6 +5,13 @@
#include "G3D/Matrix4.h"
#include "G3D/Quat.h"
+#ifdef _WIN32
+ #include "direct.h"
+#else
+ #include <sys/stat.h>
+ #include <unistd.h>
+#endif
+
const float Constants::TileSize = 533.0f + (1/3.0f);
const float Constants::MaxXY = 32.0f * Constants::TileSize;
const float Constants::ChunkSize = Constants::TileSize / 16.0f;
@@ -13,6 +20,15 @@ const float Constants::Origin[] = { -Constants::MaxXY, 0.0f, -Constants::MaxXY }
const float Constants::PI = 3.1415926f;
const float Constants::MaxStandableHeight = 1.5f;
+void Utils::CreateDir( const std::string& Path )
+{
+#ifdef _WIN32
+ _mkdir( Path.c_str());
+#else
+ mkdir( Path.c_str(), 0777 );
+#endif
+}
+
void Utils::Reverse(char word[])
{
int len = strlen(word);
@@ -181,6 +197,28 @@ G3D::Matrix4 Utils::GetWmoDoodadTransformation( DoodadInstance inst, WorldModelD
return scale * rotation * quatRotation ** translation * rootTransformation;
}
+void Utils::SaveToDisk( FILE* stream, std::string path )
+{
+ FILE* disk = fopen(path.c_str(), "wb");
+ if (!disk)
+ {
+ printf("Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str());
+ return;
+ }
+
+ uint32 size = Utils::Size(stream);
+ uint8* data = new uint8[size];
+ // Read the data to an array
+ fread(data, 1, size, stream);
+ // And write it in the file
+ fwrite(data, 1, size, disk);
+
+ // Close the filestream
+ fclose(disk);
+ // Free the used memory
+ delete data;
+}
+
void MapChunkHeader::Read(FILE* stream)
{
fread(&Flags, sizeof(uint32), 1, stream);
diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h
index a45c3659240..c19bc1bb29c 100644
--- a/src/tools/mesh_extractor/Utils.h
+++ b/src/tools/mesh_extractor/Utils.h
@@ -349,5 +349,7 @@ public:
}
static std::string Replace( std::string str, const std::string& oldStr, const std::string& newStr );
static G3D::Matrix4 GetWmoDoodadTransformation( DoodadInstance inst, WorldModelDefinition root );
+ static void CreateDir( const std::string& Path );
+ static void SaveToDisk(FILE* stream, std::string path);
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
index b4c963020c7..bd0d106dabb 100644
--- a/src/tools/mesh_extractor/WorldModelGroup.cpp
+++ b/src/tools/mesh_extractor/WorldModelGroup.cpp
@@ -36,7 +36,7 @@ void WorldModelGroup::ReadNormals()
ASSERT(normalCount == Vertices.size() && "normalCount is different than the Vertices count");
Normals.reserve(normalCount);
FILE* stream = chunk->GetStream();
- for (int i = 0; i < normalCount; i++)
+ for (uint32 i = 0; i < normalCount; i++)
Normals[i] = Vector3::Read(stream);
}
@@ -61,7 +61,7 @@ void WorldModelGroup::ReadVertices()
uint32 verticeCount = chunk->Length / 12;
Vertices.reserve(verticeCount);
FILE* stream = chunk->GetStream();
- for (int i = 0; i < verticeCount; i++)
+ for (uint32 i = 0; i < verticeCount; i++)
Vertices.push_back(Vector3::Read(stream));
}
@@ -75,7 +75,7 @@ void WorldModelGroup::ReadTriangles()
ASSERT(triangleCount == TriangleFlags.size() && "triangleCount != TriangleFlags.size()");
FILE* stream = chunk->GetStream();
Triangles.reserve(triangleCount);
- for (int i = 0; i < triangleCount; i++)
+ for (uint32 i = 0; i < triangleCount; i++)
{
uint16 v0;
uint16 v1;
@@ -97,7 +97,7 @@ void WorldModelGroup::ReadMaterials()
uint32 triangleCount = chunk->Length / 2;
TriangleFlags.reserve(triangleCount);
TriangleMaterials.reserve(triangleCount);
- for (int i = 0; i < triangleCount; i++)
+ for (uint32 i = 0; i < triangleCount; i++)
{
uint8 tmp;
fread(&tmp, sizeof(uint8), 1, stream);
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
index b98a7aae826..7b60b9b2151 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.cpp
+++ b/src/tools/mesh_extractor/WorldModelHandler.cpp
@@ -46,7 +46,7 @@ void WorldModelHandler::ProcessInternal( ChunkedData* subChunks )
int32 index;
fread(&index, sizeof(int32), 1, stream);
- if (index < 0 || index >= _definitions->size())
+ if (index < 0 || uint32(index) >= _definitions->size())
continue;
WorldModelDefinition wmo = (*_definitions)[index];
diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp
index 3457a35f761..c34a77e4531 100644
--- a/src/tools/mesh_extractor/WorldModelRoot.cpp
+++ b/src/tools/mesh_extractor/WorldModelRoot.cpp
@@ -16,7 +16,7 @@ void WorldModelRoot::ReadGroups()
{
std::string pathBase = Utils::GetPathBase(Path);
Groups.reserve(Header.CountGroups);
- for (int i = 0; i < Header.CountGroups; i++)
+ for (uint32 i = 0; i < Header.CountGroups; i++)
{
char name[200];
sprintf(name, "%s_%03u.wmo", pathBase.c_str(), i);
@@ -35,7 +35,7 @@ void WorldModelRoot::ReadDoodadSets()
FILE* stream = chunk->GetStream();
ASSERT(chunk->Length / 32 == Header.CountSets && "chunk.Length / 32 == Header.CountSets");
DoodadSets.reserve(Header.CountSets);
- for (int i = 0; i < Header.CountSets; i++)
+ for (uint32 i = 0; i < Header.CountSets; i++)
DoodadSets.push_back(DoodadSet::Read(stream));
}
@@ -49,7 +49,7 @@ void WorldModelRoot::ReadDoodadInstances()
const uint32 instanceSize = 40;
uint32 countInstances = chunk->Length / instanceSize;
DoodadInstances.reserve(countInstances);
- for (int i = 0; i < countInstances; i++)
+ for (uint32 i = 0; i < countInstances; i++)
{
FILE* stream = chunk->GetStream();
fseek(stream, instanceSize * i, SEEK_CUR);