public void AddDungeon(WMORoot model, MODF.MODFEntry def) { var verts = new List<Vector3>(); var inds = new List<Triangle<uint>>(); MapChunk.InsertWMOGeometry(def, model, verts, inds); AddGeometry(verts, inds); }
public void Read() { foreach (var subChunk in Data.Chunks) { switch (subChunk.Name) { case "MAIN": MAIN = new MAIN(subChunk); IsValid = true; TileTable = new bool[64, 64]; for (int y = 0; y < 64; y++) for (int x = 0; x < 64; x++) TileTable[x, y] = MAIN.Entries[x, y].Flags.HasFlag(MAIN.MAINFlags.HasADT); break; case "MWMO": MWMO = new MWMO(subChunk); break; case "MODF": MODF = new MODF(subChunk); break; } } IsGlobalModel = (MODF != null && MWMO != null); }
public static Matrix GetWmoDoodadTransform(MODD.MODDEntry modd, MODF.MODFEntry modf) { var modfTransform = GetTransform(modf.Position, modf.Rotation); var translation = Matrix.Translation(modd.Position); var quatRotation = Matrix.RotationQuaternion(new Quaternion(-modd.Rotation[0], -modd.Rotation[1], -modd.Rotation[2], modd.Rotation[3])); return Matrix.Scaling(modd.Scale) * quatRotation * translation * modfTransform; }
public void Read() { if (Type == ADTType.Normal) { ADTObjects = new ADT(World, X, Y, ADTType.Objects); ADTObjects.Read(); //ADTTextures = new ADT(World, X, Y, ADTType.Textures); //ADTTextures.Read(); } MapChunks = new MapChunk[16 * 16]; int mcIdx = 0; foreach (var subChunk in Data.Chunks) { switch (subChunk.Name) { case "MHDR": MHDR = new MHDR(subChunk); break; case "MMDX": MMDX = new MMDX(subChunk); break; case "MMID": MMID = new MMID(subChunk); ReadDoodads(); break; case "MWMO": MWMO = new MWMO(subChunk); break; case "MWID": MWID = new MWID(subChunk); ReadModels(); break; case "MDDF": MDDF = new MDDF(subChunk); break; case "MODF": MODF = new MODF(subChunk); break; case "MH2O": Liquid = new LiquidChunk(this, subChunk); break; case "MCNK": MapChunks[mcIdx++] = new MapChunk(this, subChunk); break; } } }
public static void InsertWMOGeometry(MODF.MODFEntry wmo, WMORoot model, List<Vector3> vertices, List<Triangle<uint>> indices) { var transform = Transformation.GetTransform(wmo.Position, wmo.Rotation); foreach (var group in model.Groups) { var vo = (uint)vertices.Count; foreach (var v in group.MOVT.Vertices) vertices.Add((Vector3)Vector3.Transform(v, transform)); for (int i = 0; i < group.MOVI.Indices.Length; i++) { if (((byte)group.MOPY.Entries[i].Flags & 0x04) != 0 && group.MOPY.Entries[i].MaterialId != 0xFF) continue; var idx = group.MOVI.Indices[i]; indices.Add(new Triangle<uint>(TriangleType.Wmo, vo + idx.V0, vo + idx.V1, vo + idx.V2)); } } if (wmo.DoodadSet >= 0 && wmo.DoodadSet < model.MODS.Entries.Length) { var set = model.MODS.Entries[wmo.DoodadSet]; var instances = new List<MODD.MODDEntry>((int)set.nDoodads); for (uint i = set.FirstInstanceIndex; i < (set.nDoodads + set.FirstInstanceIndex); i++) { if (i >= model.MODD.Entries.Length) break; instances.Add(model.MODD.Entries[(int)i]); } foreach (var instance in instances) { string path; if (!model.MODN.Filenames.TryGetValue(instance.ofsMODN, out path)) continue; var doodad = new M2(path); if (!doodad.IsCollidable) continue; var doodadTransform = Transformation.GetWmoDoodadTransform(instance, wmo); var vo = (uint)vertices.Count; foreach (var v in doodad.Vertices) vertices.Add((Vector3)Vector3.Transform(v, doodadTransform)); foreach (var t in doodad.Indices) indices.Add(new Triangle<uint>(TriangleType.Doodad, t.V0 + vo, t.V1 + vo, t.V2 + vo)); } } foreach (var group in model.Groups) { if ((group.LiquidVertices == null || group.LiquidVertices.Count == 0) || (group.LiquidIndices == null || group.LiquidIndices.Count == 0)) continue; var vo = (uint)vertices.Count; foreach (var v in group.LiquidVertices) vertices.Add((Vector3)Vector3.Transform(v, transform)); foreach (var t in group.LiquidIndices) indices.Add(new Triangle<uint>(t.Type, t.V1 + vo, t.V0 + vo, t.V2 + vo)); } }