diff options
| -rw-r--r-- | src/tools/vmap4_extractor/gameobject_extract.cpp | 42 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/model.cpp | 14 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/wmo.cpp | 38 | ||||
| -rw-r--r-- | src/tools/vmap4_extractor/wmo.h | 3 |
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; |
