aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/mesh_extractor/ADT.cpp9
-rw-r--r--src/tools/mesh_extractor/Cache.h3
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp19
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.h3
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp4
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp9
-rw-r--r--src/tools/mesh_extractor/MPQManager.h4
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp74
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp8
9 files changed, 82 insertions, 51 deletions
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
index 98bce8b2057..c564d7193cf 100644
--- a/src/tools/mesh_extractor/ADT.cpp
+++ b/src/tools/mesh_extractor/ADT.cpp
@@ -29,14 +29,7 @@ ADT::~ADT()
void ADT::Read()
{
- Chunk* mhdr = Data->GetChunkByName("MHDR");
- if (!mhdr)
- {
- delete Data;
- Data = NULL;
- return;
- }
- Header.Read(mhdr->GetStream());
+ Header.Read(Data->GetChunkByName("MHDR")->GetStream());
MapChunks.reserve(16 * 16);
int mapChunkIndex = 0;
diff --git a/src/tools/mesh_extractor/Cache.h b/src/tools/mesh_extractor/Cache.h
index 83b6ba6ca7a..49e268ec507 100644
--- a/src/tools/mesh_extractor/Cache.h
+++ b/src/tools/mesh_extractor/Cache.h
@@ -3,6 +3,7 @@
#include <string>
#include <map>
#include "Common.h"
+#include "ace/Synch.h"
class WorldModelRoot;
class Model;
@@ -20,6 +21,7 @@ public:
{
if (_items.size() > FlushLimit)
Clear();
+ ACE_GUARD(ACE_Thread_Mutex, g, mutex);
_items[key] = val;
}
@@ -39,6 +41,7 @@ public:
}
private:
std::map<K, T*> _items;
+ ACE_Thread_Mutex mutex;
};
class CacheClass
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
index 9d3b18491f1..96f9085de8c 100644
--- a/src/tools/mesh_extractor/ContinentBuilder.cpp
+++ b/src/tools/mesh_extractor/ContinentBuilder.cpp
@@ -3,6 +3,7 @@
#include "WDT.h"
#include "Utils.h"
#include "DetourNavMesh.h"
+#include "Cache.h"
#include "ace/Task.h"
class BuilderThread : public ACE_Task<ACE_MT_SYNCH>
@@ -17,7 +18,7 @@ public:
int svc()
{
Free = false;
- printf("[%02i,%02i] Building tile", X, Y);
+ printf("[%02i,%02i] Building tile\n", X, Y);
TileBuilder builder(Continent, X, Y, MapId);
char buff[100];
sprintf(buff, "%03u%02u%02u.mmtile", MapId, X, Y);
@@ -63,14 +64,11 @@ void ContinentBuilder::Build()
fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
fclose(mmap);
std::vector<BuilderThread*> Threads;
- /*for (uint32 i = 0; i < 1; ++i)
- Threads.push_back(new BuilderThread());*/
+ for (uint32 i = 0; i < NumberOfThreads; ++i)
+ Threads.push_back(new BuilderThread());
for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
{
- BuilderThread th;
- th.SetData(itr->X, itr->Y, MapId, Continent);
- th.svc();
- /*bool next = false;
+ bool next = false;
while (!next)
{
for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
@@ -85,13 +83,14 @@ void ContinentBuilder::Build()
}
// Wait for 20 seconds
ACE_OS::sleep(ACE_Time_Value (0, 20000));
- }*/
+ }
}
+ Cache->Clear();
- /*// Free memory
+ // Free memory
for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
{
(*_th)->wait();
delete *_th;
- }*/
+ }
}
diff --git a/src/tools/mesh_extractor/ContinentBuilder.h b/src/tools/mesh_extractor/ContinentBuilder.h
index 92c97c5f7e0..d3da984595d 100644
--- a/src/tools/mesh_extractor/ContinentBuilder.h
+++ b/src/tools/mesh_extractor/ContinentBuilder.h
@@ -7,11 +7,12 @@
class ContinentBuilder
{
public:
- ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt) : MapId(mapId), Continent(continent), TileMap(wdt) {}
+ ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt, uint32 tn) : MapId(mapId), Continent(continent), TileMap(wdt), NumberOfThreads(tn) {}
void Build();
private:
std::string Continent;
WDT* TileMap;
uint32 MapId;
+ uint32 NumberOfThreads;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
index f6f8e5678c6..9a40e08b73a 100644
--- a/src/tools/mesh_extractor/LiquidHandler.cpp
+++ b/src/tools/mesh_extractor/LiquidHandler.cpp
@@ -25,7 +25,11 @@ void LiquidHandler::HandleNewLiquid()
{
H2OHeader h = header[i];
if (h.LayerCount == 0)
+ {
+ // Need to fill in missing data with dummies.
+ MCNKData.push_back(MCNKLiquidData(NULL, H2ORenderMask()));
continue;
+ }
fseek(stream, chunk->Offset + h.OffsetInformation, SEEK_SET);
H2OInformation information = H2OInformation::Read(stream);
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
index 24e7e827548..5ea6198e76d 100644
--- a/src/tools/mesh_extractor/MPQManager.cpp
+++ b/src/tools/mesh_extractor/MPQManager.cpp
@@ -3,6 +3,8 @@
#include "DBC.h"
#include "Utils.h"
+#include "ace/Synch.h"
+
char* MPQManager::Files[] = {
"common.MPQ",
"common-2.MPQ",
@@ -27,12 +29,6 @@ void MPQManager::Initialize()
}
}
-void MPQManager::LoadMaps()
-{
- DBC* file = GetDBC("Map");
- printf("NAME %s\n", file->GetRecordById(608)->GetString(1).c_str());
-}
-
void MPQManager::InitializeDBC()
{
CurLocale = 0;
@@ -54,6 +50,7 @@ void MPQManager::InitializeDBC()
FILE* MPQManager::GetFile( std::string path )
{
+ ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
MPQFile file(path.c_str());
if (file.isEof())
return NULL;
diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h
index 725e0168237..634c70cedeb 100644
--- a/src/tools/mesh_extractor/MPQManager.h
+++ b/src/tools/mesh_extractor/MPQManager.h
@@ -2,6 +2,7 @@
#define MPQ_MANAGER_H
#include "MPQ.h"
+#include "ace/Synch.h"
class DBC;
class MPQManager
@@ -11,7 +12,6 @@ public:
~MPQManager() {}
void Initialize();
- void LoadMaps();
FILE* GetFile(std::string path);
DBC* GetDBC(std::string name);
@@ -22,6 +22,8 @@ public:
static char* Languages[];
protected:
void InitializeDBC();
+private:
+ ACE_Thread_Mutex mutex;
};
extern MPQManager* MPQHandler;
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
index 7ae6afadb84..2884b998ac8 100644
--- a/src/tools/mesh_extractor/MeshExtractor.cpp
+++ b/src/tools/mesh_extractor/MeshExtractor.cpp
@@ -4,42 +4,73 @@
#include "Cache.h"
#include "DBC.h"
+#include <set>
+
#include "Common.h"
#include "LoginDatabase.h"
+#include "Util.h"
LoginDatabaseWorkerPool LoginDatabase;
MPQManager* MPQHandler;
CacheClass* Cache;
-void ExtractAllMaps(uint32 onlyMap)
+void ExtractAllMaps(std::set<uint32>& mapIds, uint32 threads)
{
DBC* dbc = MPQHandler->GetDBC("Map");
for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
{
uint32 mapId = (*itr)->Values[0];
- if (onlyMap && mapId != onlyMap)
+
+ // Skip this map if a list of specific maps was provided and this one is not contained in it.
+ if (!mapIds.empty() && mapIds.find(mapId) == mapIds.end())
continue;
+
std::string name = (*itr)->GetString(1);
WDT wdt("World\\maps\\" + name + "\\" + name + ".wdt");
if (!wdt.IsValid || wdt.IsGlobalModel)
continue;
printf("Building %s MapId %u\n", name.c_str(), mapId);
- ContinentBuilder builder(name, mapId, &wdt);
+ ContinentBuilder builder(name, mapId, &wdt, threads);
builder.Build();
}
- /*
- WDT wdt("World\\maps\\DalaranPrison\\DalaranPrison.wdt");
- if (!wdt.IsValid)
- return;
- printf("Model valid!\n");
- if (wdt.IsGlobalModel)
+}
+
+bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapList)
+{
+ char* param = NULL;
+ for (int i = 1; i < argc; ++i)
{
- printf("Unsupported\n");
- return;
+ if (strcmp(argv[i], "--threads") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ threads = atoi(param);
+ printf("Using %i threads\n", threads);
+ }
+ if (strcmp(argv[i], "--maps") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+ std::string maps = std::string(param);
+ Tokens tokens(maps, ',');
+
+ for (Tokens::iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
+ mapList.insert(atoi(*itr));
+
+ printf("Extracting only provided list of maps (%u).\n", mapList.size());
+ }
}
- ContinentBuilder builder("DalaranPrison", &wdt);
- builder.Build();
- */
+ return true;
+}
+
+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");
}
int main(int argc, char* argv[])
@@ -48,11 +79,16 @@ int main(int argc, char* argv[])
Cache = new CacheClass();
MPQHandler = new MPQManager();
MPQHandler->Initialize();
- MPQHandler->LoadMaps();
- uint32 onlyMap = 0;
- if (argc == 2)
- onlyMap = uint32(atoi(argv[1]));
- ExtractAllMaps(onlyMap);
+ uint32 threads = 4;
+ std::set<uint32> mapIds;
+
+ if (!HandleArgs(argc, argv, threads, mapIds))
+ {
+ PrintUsage();
+ return -1;
+ }
+
+ ExtractAllMaps(mapIds, threads);
return 0;
}
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
index baf1fa0375c..926d2591f1a 100644
--- a/src/tools/mesh_extractor/TileBuilder.cpp
+++ b/src/tools/mesh_extractor/TileBuilder.cpp
@@ -9,6 +9,8 @@
#include "RecastAlloc.h"
#include "DetourNavMeshBuilder.h"
+#include "ace/Synch.h"
+
TileBuilder::TileBuilder(std::string world, int x, int y, uint32 mapId) : _Geometry(NULL), World(world), X(x), Y(y), MapId(mapId), DataSize(0)
{
// Cell Size = TileSize / TileVoxelSize
@@ -54,11 +56,6 @@ uint8* TileBuilder::Build()
{
adt = new ADT(Utils::GetAdtPath(World, X, Y));
adt->Read();
- if (!adt->Data)
- {
- delete adt;
- return NULL;
- }
Cache->AdtCache.Insert(std::make_pair(X, Y), adt);
}
_Geometry->AddAdt(adt);
@@ -234,7 +231,6 @@ uint8* TileBuilder::Build()
DataSize = navDataSize;
rcFreePolyMesh(pmesh);
rcFreePolyMeshDetail(dmesh);
- Cache->Clear();
return navData;
}