public void Read() { foreach (var subChunk in Data.Chunks) { switch (subChunk.Name) { case "MOHD": MOHD = new MOHD(subChunk); break; case "MOGN": MOGN = new MOGN(subChunk); break; case "MOGI": MOGI = new MOGI(subChunk); break; case "MODD": MODD = new MODD(subChunk); break; case "MODN": MODN = new MODN(subChunk); break; case "MODS": MODS = new MODS(subChunk); break; } } ReadGroups(); }
private MODD[] ReadMODDChunk(BlizzHeader chunk, BinaryReader bin) { var numDoodads = chunk.Size / 40; var doodads = new MODD[numDoodads]; for (var i = 0; i < numDoodads; i++) { var raw_offset = bin.ReadBytes(3); doodads[i].offset = (uint)(raw_offset[0] | raw_offset[1] << 8 | raw_offset[2] << 16); doodads[i].flags = bin.ReadByte(); doodads[i].position = bin.Read <Vector3>(); doodads[i].rotation = bin.Read <Quaternion>(); doodads[i].scale = bin.ReadSingle(); doodads[i].color = bin.ReadBytes(4); } return(doodads); }
public void Read(byte[] data) { // Clear chunks to prevent double data. Chunks.Clear(); using (var stream = new MemoryStream(data)) using (var reader = new BinaryReader(stream)) { while (reader.BaseStream.Position < reader.BaseStream.Length) { var chunkId = (WMOChunkId)reader.ReadUInt32(); var chunkSize = reader.ReadUInt32(); var chunkData = new byte[chunkSize]; Buffer.BlockCopy(stream.ToArray(), (int)reader.BaseStream.Position, chunkData, 0, (int)chunkSize); IChunk chunk = null; switch (chunkId) { case WMOChunkId.MVER: chunk = new MVER(); break; case WMOChunkId.MOHD: chunk = new MOHD(); break; case WMOChunkId.MOTX: chunk = new MOTX(); break; case WMOChunkId.MOMT: chunk = new MOMT(); break; case WMOChunkId.MOGN: chunk = new MOGN(); break; case WMOChunkId.MOGI: chunk = new MOGI(); break; case WMOChunkId.MOPV: chunk = new MOPV(); break; case WMOChunkId.MOPT: chunk = new MOPT(); break; case WMOChunkId.MOPR: chunk = new MOPR(); break; case WMOChunkId.MOLT: chunk = new MOLT(); break; case WMOChunkId.MODS: chunk = new MODS(); break; case WMOChunkId.MODI: chunk = new MODI(); break; case WMOChunkId.MODD: chunk = new MODD(); break; case WMOChunkId.MFOG: chunk = new MFOG(); break; default: Console.WriteLine($"Skipping {chunkId} (0x{(uint)chunkId:X})"); break; } if (chunk != null) { chunk.Read(chunkData); Chunks.Add(chunk); } reader.BaseStream.Position += chunkSize; } // Add mandatory chunks. Chunks.Add(new MOSB()); Chunks.Add(new MOVV()); Chunks.Add(new MOVB()); // Close the streams so they can be written. reader.Close(); stream.Close(); } }