private static TileModel ExtractModel(MapObjectDefinition wmo, DoodadDefinition definition) { var filePath = definition.FilePath; var m2model = ExtractM2Model(filePath); return TransformM2Model(wmo, definition, m2model); }
private static TileModel TransformM2Model(MapObjectDefinition wmo, DoodadDefinition definition, M2Model m2model) { var model = new TileModel { Vertices = new Vector3[m2model.BoundingVertices.Length] }; var origin = new Vector3(-definition.Position.X, definition.Position.Z, definition.Position.Y); var wmoOrigin = CorrectWMOOrigin(wmo.Position); var rotation = definition.Rotation; var rotateY = Matrix.CreateRotationY((wmo.OrientationB - 90) * RadiansPerDegree); for (var i = 0; i < m2model.BoundingVertices.Length; i++) { var vector = m2model.BoundingVertices[i]; var rotatedVector = Vector3.Transform(vector, rotation); rotatedVector = TransformToIntermediateCoords(rotatedVector); var finalModelVector = rotatedVector + origin; var rotatedWMOVector = Vector3.Transform(finalModelVector, rotateY); var finalWMOVector = rotatedWMOVector + wmoOrigin; model.Vertices[i] = finalWMOVector; } // Add the triangle indices to the model model.Triangles = new Index3[m2model.BoundingTriangles.Length]; for (var i = 0; i < m2model.BoundingTriangles.Length; i++) { var tri = m2model.BoundingTriangles[i]; model.Triangles[i] = new Index3 { Index0 = (short)tri[2], Index1 = (short)tri[1], Index2 = (short)tri[0] }; } // Calculate the boundingbox model.Bounds = new BoundingBox(model.Vertices); return model; }
static void ReadMODD(BinaryReader br, WMORoot wmo, uint size) { // Why oh why is wmo.Header.DoodadCount wrong sometimes uint count = size / 40; // 40 is the size of DoodadDefinition wmo.DoodadDefinitions = new DoodadDefinition[count]; for (int i = 0; i < wmo.DoodadDefinitions.Length; i++) { var dd = new DoodadDefinition { NameIndex = br.ReadInt32(), Position = br.ReadVector3(), Rotation = br.ReadQuaternion(), Scale = br.ReadSingle(), Color = br.ReadUInt32() }; if (dd.NameIndex != -1) { if (!wmo.DoodadFiles.TryGetValue(dd.NameIndex, out dd.FilePath)) { Console.WriteLine("Erroneous dd.NameIndex in WmoRoot: {0}", wmo.FilePath); } } wmo.DoodadDefinitions[i] = dd; } }