diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp
index 01c1f3f5b53..d34c2a3cfdf 100644
--- a/src/tools/vmap4_extractor/adtfile.cpp
+++ b/src/tools/vmap4_extractor/adtfile.cpp
@@ -15,12 +15,11 @@
* with this program. If not, see .
*/
-#include "vmapexport.h"
#include "adtfile.h"
-#include "StringFormat.h"
-#include
-#include "Errors.h"
#include "Memory.h"
+#include "StringFormat.h"
+#include "vmapexport.h"
+#include
char const* GetPlainName(char const* FileName)
{
@@ -183,16 +182,15 @@ bool ADTFile::init(uint32 map_num, uint32 originalMapId)
{
ADT::MDDF doodadDef;
_file.read(&doodadDef, sizeof(ADT::MDDF));
- if (!(doodadDef.Flags & 0x40))
- {
- Doodad::Extract(doodadDef, ModelInstanceNames[doodadDef.Id].c_str(), map_num, originalMapId, dirfile.get(), dirfileCache);
- }
+
+ std::string fileName;
+ if (doodadDef.Flags & 0x40)
+ fileName = Trinity::StringFormat("FILE{:08X}.xxx", doodadDef.Id);
else
- {
- std::string fileName = Trinity::StringFormat("FILE{:08X}.xxx", doodadDef.Id);
- ExtractSingleModel(fileName);
+ fileName = ModelInstanceNames[doodadDef.Id];
+
+ if (ExtractSingleModel(fileName))
Doodad::Extract(doodadDef, fileName.c_str(), map_num, originalMapId, dirfile.get(), dirfileCache);
- }
}
ModelInstanceNames.clear();
@@ -210,15 +208,18 @@ bool ADTFile::init(uint32 map_num, uint32 originalMapId)
std::string fileName;
if (mapObjDef.Flags & 0x8)
- {
fileName = Trinity::StringFormat("FILE{:08X}.xxx", mapObjDef.Id);
- ExtractSingleWmo(fileName);
- }
else
fileName = WmoInstanceNames[mapObjDef.Id];
- MapObject::Extract(mapObjDef, fileName.c_str(), false, map_num, originalMapId, dirfile.get(), dirfileCache);
- Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, false, map_num, originalMapId, dirfile.get(), dirfileCache);
+ if (ExtractedModelData const* extracted = ExtractSingleWmo(fileName))
+ {
+ if (extracted->HasCollision())
+ MapObject::Extract(mapObjDef, fileName.c_str(), false, map_num, originalMapId, dirfile.get(), dirfileCache);
+
+ if (extracted->Doodads)
+ Doodad::ExtractSet(*extracted->Doodads, mapObjDef, false, map_num, originalMapId, dirfile.get(), dirfileCache);
+ }
}
WmoInstanceNames.clear();
diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp
index 9b6188304d7..df9fcb95f16 100644
--- a/src/tools/vmap4_extractor/gameobject_extract.cpp
+++ b/src/tools/vmap4_extractor/gameobject_extract.cpp
@@ -19,6 +19,7 @@
#include "DB2CascFileSource.h"
#include "Errors.h"
#include "ExtractorDB2LoadInfo.h"
+#include "Memory.h"
#include "model.h"
#include "StringFormat.h"
#include "vmapexport.h"
@@ -28,10 +29,10 @@
#include
#include "advstd.h"
-bool ExtractSingleModel(std::string& fname)
+ExtractedModelData const* ExtractSingleModel(std::string& fname)
{
if (fname.length() < 4)
- return false;
+ return nullptr;
std::string extension = fname.substr(fname.length() - 4, 4);
if (extension == ".mdx" || extension == ".MDX" || extension == ".mdl" || extension == ".MDL")
@@ -45,18 +46,28 @@ bool ExtractSingleModel(std::string& fname)
char* name = GetPlainName((char*)fname.c_str());
NormalizeFileName(name, strlen(name));
+ auto [model, shouldExtract] = BeginModelExtraction(name);
+ if (!shouldExtract)
+ {
+ model->Wait();
+ return model->State.load(std::memory_order::relaxed) == ExtractedModelData::Ok ? model : nullptr;
+ }
+
+ auto stateGuard = Trinity::make_unique_ptr_with_deleter<&ExtractedModelData::Fail>(model);
+
+ Model mdl(originalName);
+ if (!mdl.open())
+ return nullptr;
+
std::string output(szWorkDirWmo);
output += "/";
output += name;
- if (FileExists(output.c_str()))
- return true;
+ if (!mdl.ConvertToVMAPModel(output.c_str()))
+ return nullptr;
- Model mdl(originalName);
- if (!mdl.open())
- return false;
-
- return mdl.ConvertToVMAPModel(output.c_str());
+ stateGuard->Complete();
+ return stateGuard.release();
}
extern std::shared_ptr CascStorage;
@@ -123,9 +134,12 @@ void ExtractGameobjectModels()
std::string_view header(headerRaw.data(), headerRaw.size());
if (header == "REVM")
- result = ExtractSingleWmo(fileName);
+ {
+ ExtractedModelData const* wmo = ExtractSingleWmo(fileName);
+ result = wmo && wmo->HasCollision();
+ }
else if (header == "MD20" || header == "MD21")
- result = ExtractSingleModel(fileName);
+ result = ExtractSingleModel(fileName) != nullptr;
else if (header == "BLP2")
continue; // broken db2 data
else
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 9b4b629265c..fc4aff04902 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -159,21 +159,7 @@ Vec3D fixCoordSystem(Vec3D const& v)
void Doodad::Extract(ADT::MDDF const& doodadDef, char const* ModelInstName, uint32 mapID, uint32 originalMapId, FILE* pDirfile, std::vector* dirfileCache)
{
- std::string tempname = Trinity::StringFormat("{}/{}", szWorkDirWmo, ModelInstName);
- FILE* input = fopen(tempname.c_str(), "r+b");
-
- if (!input)
- return;
-
- fseek(input, 8, SEEK_SET); // get the correct no of vertices
- int nVertices;
- int count = fread(&nVertices, sizeof(int), 1, input);
- fclose(input);
-
- if (count != 1 || nVertices == 0)
- return;
-
- // scale factor - divide by 1024. blizzard devs must be on crack, why not just use a float?
+ // scale factor - divide by 1024
float sc = doodadDef.Scale / 1024.0f;
Vec3D position = fixCoords(doodadDef.Position);
@@ -261,17 +247,7 @@ void Doodad::ExtractSet(WMODoodadData const& doodadData, ADT::MODF const& wmo, b
nlen = ModelInstName.length();
}
- std::string tempname = Trinity::StringFormat("{}/{}", szWorkDirWmo, ModelInstName);
- FILE* input = fopen(tempname.c_str(), "r+b");
- if (!input)
- continue;
-
- fseek(input, 8, SEEK_SET); // get the correct no of vertices
- int nVertices;
- int count = fread(&nVertices, sizeof(int), 1, input);
- fclose(input);
-
- if (count != 1 || nVertices == 0)
+ if (!ExtractSingleModel(ModelInstName))
continue;
ASSERT(doodadId < std::numeric_limits::max());
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index 3f3e29685f0..92bb2b087a2 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -24,7 +24,10 @@
#include "Locales.h"
#include "MapDefines.h"
#include "MapUtils.h"
+#include "Memory.h"
+#include "StringConvert.h"
#include "StringFormat.h"
+#include "ThreadPool.h"
#include "Util.h"
#include "VMapDefinitions.h"
#include "wdtfile.h"
@@ -33,7 +36,6 @@
#include
#include
#include
-#include
#include
#include