Tools/vmapextractor: Update to new m2 and wmo structures

This commit is contained in:
Shauren
2016-07-22 17:34:15 +02:00
parent ed07955372
commit de4c42496f
4 changed files with 65 additions and 30 deletions

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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);
// full LOD reading code for reference
// commented out as we are not interested in any of them beyond first, most detailed
if (flags & 16) // LOD related
f.seekRelative(8);
}
//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"))

View File

@@ -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;