aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/vmap4_extractor/gameobject_extract.cpp42
-rw-r--r--src/tools/vmap4_extractor/model.cpp14
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp38
-rw-r--r--src/tools/vmap4_extractor/wmo.h3
4 files changed, 66 insertions, 31 deletions
diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp
index 8949111a5cd..b6072e9e701 100644
--- a/src/tools/vmap4_extractor/gameobject_extract.cpp
+++ b/src/tools/vmap4_extractor/gameobject_extract.cpp
@@ -25,8 +25,20 @@
#include <algorithm>
#include <stdio.h>
-bool ExtractSingleModel(std::string& name)
+bool ExtractSingleModel(std::string& fname)
{
+ if (fname.substr(fname.length() - 4, 4) == ".mdx")
+ {
+ fname.erase(fname.length() - 2, 2);
+ fname.append("2");
+ }
+
+ std::string originalName = fname;
+
+ char* name = GetPlainName((char*)fname.c_str());
+ FixNameCase(name, strlen(name));
+ FixNameSpaces(name, strlen(name));
+
std::string output(szWorkDirWmo);
output += "/";
output += name;
@@ -34,7 +46,7 @@ bool ExtractSingleModel(std::string& name)
if (FileExists(output.c_str()))
return true;
- Model mdl(name);
+ Model mdl(originalName);
if (!mdl.open())
return false;
@@ -64,22 +76,22 @@ enum ModelTypes : uint32
{
MODEL_MD20 = '02DM',
MODEL_MD21 = '12DM',
- MODEL_WMO = 'REVM'
+ MODEL_WMO = 'MVER'
};
-uint32 GetHeaderMagic(std::string const& fileName)
+bool GetHeaderMagic(std::string const& fileName, uint32* magic)
{
+ *magic = 0;
HANDLE file;
if (!CascOpenFile(CascStorage, fileName.c_str(), CASC_LOCALE_ALL, 0, &file))
- return 0;
+ return false;
std::unique_ptr<HANDLE, CascFileHandleDeleter> modelFile(file);
- uint32 magic = 0;
DWORD bytesRead = 0;
- if (!CascReadFile(file, &magic, 4, &bytesRead) || bytesRead != 4)
- return 0;
+ if (!CascReadFile(file, magic, 4, &bytesRead) || bytesRead != 4)
+ return false;
- return magic;
+ return true;
}
void ExtractGameobjectModels()
@@ -116,12 +128,18 @@ void ExtractGameobjectModels()
if (!fileId)
continue;
- std::string fileName = Trinity::StringFormat("FILE%08X", fileId);
+ std::string fileName = Trinity::StringFormat("FILE%08X.xxx", fileId);
bool result = false;
- if (GetHeaderMagic(fileName) == MODEL_WMO)
+ uint32 header;
+ if (!GetHeaderMagic(fileName, &header))
+ continue;
+
+ if (header == MODEL_WMO)
result = ExtractSingleWmo(fileName);
- else
+ else if (header == MODEL_MD20 || header == MODEL_MD21)
result = ExtractSingleModel(fileName);
+ else
+ ASSERT(false, "%s header: %d - %c%c%c%c", fileName.c_str(), header, (header >> 24) & 0xFF, (header >> 16) & 0xFF, (header >> 8) & 0xFF, header & 0xFF);
if (result)
{
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 01be7aafdbe..7ce5cd12103 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -45,15 +45,17 @@ bool Model::open()
_unload();
- uint32 m2start = 0;
+ int32 m2start = 0;
char const* ptr = f.getBuffer();
while (m2start + 4 < f.getSize() && *reinterpret_cast<uint32 const*>(ptr) != '02DM')
{
++m2start;
++ptr;
+ if (m2start + sizeof(ModelHeader) > f.getSize())
+ return false;
}
- memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
+ memcpy(&header, f.getBuffer() + m2start, sizeof(ModelHeader));
if (header.nBoundingTriangles > 0)
{
f.seek(m2start);
@@ -185,21 +187,21 @@ ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID
return;
uint16 adtId = 0;// not used for models
- uint32 flags = MOD_M2;
+ uint32 tcflags = MOD_M2;
if (tileX == 65 && tileY == 65)
- flags |= MOD_WORLDSPAWN;
+ tcflags |= MOD_WORLDSPAWN;
//write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name
fwrite(&mapID, sizeof(uint32), 1, pDirfile);
fwrite(&tileX, sizeof(uint32), 1, pDirfile);
fwrite(&tileY, sizeof(uint32), 1, pDirfile);
- fwrite(&flags, sizeof(uint32), 1, pDirfile);
+ fwrite(&tcflags, sizeof(uint32), 1, pDirfile);
fwrite(&adtId, sizeof(uint16), 1, pDirfile);
fwrite(&id, sizeof(uint32), 1, pDirfile);
fwrite(&pos, sizeof(float), 3, pDirfile);
fwrite(&rot, sizeof(float), 3, pDirfile);
fwrite(&sc, sizeof(float), 1, pDirfile);
- uint32 nlen=strlen(ModelInstName);
+ uint32 nlen = strlen(ModelInstName);
fwrite(&nlen, sizeof(uint32), 1, pDirfile);
fwrite(ModelInstName, sizeof(char), nlen, pDirfile);
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 4bceebc8f0c..6f3d25e8aeb 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -33,7 +33,7 @@ extern std::vector<uint16> LiqType;
WMORoot::WMORoot(std::string &filename)
: filename(filename), color(0), nTextures(0), nGroups(0), nPortals(0), nLights(0),
- nDoodadNames(0), nDoodadDefs(0), nDoodadSets(0), RootWMOID(0), flags(0)
+ nDoodadNames(0), nDoodadDefs(0), nDoodadSets(0), RootWMOID(0), flags(0), numLod(0)
{
memset(bbcorn1, 0, sizeof(bbcorn1));
memset(bbcorn2, 0, sizeof(bbcorn2));
@@ -76,20 +76,34 @@ bool WMORoot::open()
f.read(&RootWMOID, 4);
f.read(bbcorn1, 12);
f.read(bbcorn2, 12);
- f.read(&flags, 4);
- break;
+ f.read(&flags, 2);
+ f.read(&numLod, 2);
}
else if (!strcmp(fourcc, "GFID"))
{
- for (uint32 gp = 0; gp < nGroups; ++gp)
- {
- uint32 fileDataId;
- f.read(&fileDataId, 4);
- groupFileDataIDs.push_back(fileDataId);
-
- if (flags & 16) // LOD related
- f.seekRelative(8);
- }
+ // full LOD reading code for reference
+ // commented out as we are not interested in any of them beyond first, most detailed
+
+ //uint16 lodCount = 1;
+ //if (flags & 0x10)
+ //{
+ // if (numLod)
+ // lodCount = numLod;
+ // else
+ // lodCount = 3;
+ //}
+
+ //for (uint32 lod = 0; lod < lodCount; ++lod)
+ //{
+ for (uint32 gp = 0; gp < nGroups; ++gp)
+ {
+ uint32 fileDataId;
+ f.read(&fileDataId, 4);
+ if (fileDataId)
+ groupFileDataIDs.push_back(fileDataId);
+ }
+ // break;
+ //}
}
/*
else if (!strcmp(fourcc,"MOTX"))
diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h
index 4246dbe0e5a..67a4ecfba56 100644
--- a/src/tools/vmap4_extractor/wmo.h
+++ b/src/tools/vmap4_extractor/wmo.h
@@ -49,9 +49,10 @@ private:
std::string filename;
public:
unsigned int color;
- uint32 nTextures, nGroups, nPortals, nLights, nDoodadNames, nDoodadDefs, nDoodadSets, RootWMOID, flags;
+ uint32 nTextures, nGroups, nPortals, nLights, nDoodadNames, nDoodadDefs, nDoodadSets, RootWMOID;
float bbcorn1[3];
float bbcorn2[3];
+ uint16 flags, numLod;
std::vector<uint32> groupFileDataIDs;