public static WMORoot Process(MpqManager mpqManager, string filePath)
{
var root = new WMORoot(filePath);
if (!mpqManager.FileExists(filePath))
{
log.Error("WMO file does not exist: ", filePath);
}
using (var stream = mpqManager.OpenFile(filePath))
using (var fileReader = new BinaryReader(stream))
{
uint type = 0;
uint size = 0;
long curPos = AdvanceToNextChunk(fileReader, 0, ref type, ref size);
if (type == Signatures.MVER)
{
// Version
ReadMVER(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MVER");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOHD)
{
// Root Header
ReadMOHD(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOHD");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOTX)
{
// Texture Names
ReadMOTX(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOTX");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOMT)
{
// Materials
ReadMOMT(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOMT");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOGN)
{
ReadMOGN(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOGN");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOGI)
{
// Group Information
ReadMOGI(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOGI");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOSB)
{
// Skybox (always 0 now, its no longer handled in WMO)
ReadMOSB(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOSB");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOPV)
{
// Portal Vertices
ReadMOPV(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOPV");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOPT)
{
// Portal Information
ReadMOPT(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOPT");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOPR)
{
// Portal Relations
ReadMOPR(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOPR");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOVV)
{
// Visible Vertices
ReadMOVV(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOVV");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOVB)
{
// Visible Blocks
ReadMOVB(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOVB");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MOLT)
{
// Lights
ReadMOLT(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MOLT");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MODS)
{
// Doodad Set
ReadMODS(fileReader, root);
}
else
{
Console.WriteLine("WMO Root missing required chunk MODS");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MODN)
{
// Doodad Names
ReadMODN(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MODN");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MODD)
{
// Doodad Definitions
ReadMODD(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MODD");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
if (type == Signatures.MFOG)
{
// Fog info
ReadMFOG(fileReader, root, size);
}
else
{
Console.WriteLine("WMO Root missing required chunk MFOG");
}
curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
// Theres only 1 optional chunk in a WMO root
if (fileReader.BaseStream.Position < fileReader.BaseStream.Length)
{
if (type == Signatures.MCVP)
{
ReadMCVP(fileReader, root, size);
}
//curPos = AdvanceToNextChunk(fileReader, curPos, ref type, ref size);
}
}
return root;
}