private static M2 TransformWMOM2(M2Model model, IEnumerable<int> indicies, DoodadDefinition modd) { var currentM2 = new M2(); currentM2.Vertices.Clear(); currentM2.Indices.Clear(); var origin = new Vector3(modd.Position.X, modd.Position.Y, modd.Position.Z); // Create the scalar var scalar = modd.Scale; var scaleMatrix = Matrix.CreateScale(scalar); // Create the rotations var quatX = modd.Rotation.X; var quatY = modd.Rotation.Y; var quatZ = modd.Rotation.Z; var quatW = modd.Rotation.W; var rotQuat = new Quaternion(quatX, quatY, quatZ, quatW); var rotMatrix = Matrix.CreateFromQuaternion(rotQuat); var compositeMatrix = Matrix.Multiply(scaleMatrix, rotMatrix); for (var i = 0; i < model.BoundingVertices.Length; i++) { // Scale and transform var basePosVector = model.BoundingVertices[i]; var baseNormVector = model.BoundingNormals[i]; //PositionUtil.TransformToXNACoordSystem(ref vertex.Position); // Scale //Vector3 scaledVector; //Vector3.Transform(ref vector, ref scaleMatrix, out scaledVector); // Rotate Vector3 rotatedPosVector; Vector3.Transform(ref basePosVector, ref compositeMatrix, out rotatedPosVector); Vector3 rotatedNormVector; Vector3.Transform(ref baseNormVector, ref compositeMatrix, out rotatedNormVector); rotatedNormVector.Normalize(); // Translate Vector3 finalPosVector; Vector3.Add(ref rotatedPosVector, ref origin, out finalPosVector); currentM2.Vertices.Add(finalPosVector); } currentM2.Indices.AddRange(indicies); return currentM2; }
static void ReadMODD(BinaryReader br, WMORoot wmo, uint size) { // Why oh why is wmo.Header.DoodadCount wrong sometimes // 40 is the size of DoodadDefinition wmo.DoodadDefinitions = new DoodadDefinition[size / 40]; for (var 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.ReadColor4() }; if (dd.NameIndex != -1) { if(!wmo.DoodadFiles.TryGetValue(dd.NameIndex, out dd.FilePath)) { dd.FilePath = ""; log.Error(String.Format("Doodad File Path for index: {0} missing from the Dictionary!", dd.NameIndex)); } } wmo.DoodadDefinitions[i] = dd; } }